JSON序列化时不对byte[]类型数据序列化
最近,我遇到一个颇为独特的需求:需以JSON格式通过TCP将结果数据发送给客户。由于数据格式为JSON,我自然而然地想到使用Newtonsoft对类进行序列化。然而,生成的JSON数据中,某一个byte[]类型的属性数据默认采用了base64编码进行转换。鉴于该byte[]中存储的是十六进制数据,而客户仅需要十六进制格式的数据,因此我查阅了大量资料,并尝试了多种方法。最终,成功解决了这一问题,特此记录如下。
这是byte[]的16进制形式
7F7FDF04000F24005F00A100E30185022703C90323042C045404630485049704A904BB04000022054E9100000428040018000C0003400301D00700000007000000005D1D33000000F4013201000029000001FF434E2300000500771B05001480005E001903050F090700000000633A0000254D1500820000008D090001000000000000000000000000000000000000000000000000000002151903050F090700000001810184FEFE00D7FE5F01A1FE7601ABFE41018DFE9101ADFE3E0184FE2501A9FE38017AFE3B01AAFE79019AFE1501D5FE4601ADFE3301BFFE64018BFE0F01BBFE6C01A2FE0801A3FE4D01D5FE0701A0FE6A01B3FE820184FE220182FE680196FE2F01B8FE1F01A4FE0C01A6FE6C01C0FE4701A1FE4301F7FE3601C7FE0A01A3FE3101ABFE4A017EFE7D01A5FE63019DFE7301C7FE51019DFE4A01C4FE3C019DFE2B01D9FE47019BFEF6001AFF3301A0FE0080008000800080CC00008059015DFEF100D5FE5A0187FEC7FC82FF7D009CFD19FFC1FEBF0025FE00800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800080008000800002CCADD6D09AC3ABA6BC90A8A2A1BAA1AD9DB5A49AA2BC9F9DADA4AFB7AB9CB1A9ADAFA5ACA9A6ABA39FB69992A9A1A7AC9699AF97A7A19AADA694979AAEA6ADA19FA09CA0A1B5AEAFB9BCA5B1A997A0AE959AACB190A2A196196A262E681C795FF6F2F0EEFFBFFFFF41A83680202414421A19251E191E161D1E1B140B130F1D1D161B180D140D16100D171014130D111A1B1A12111D10150C12111311100F191000038E8C909089888A898D8688888889878785888786868687888785878A868385898584858783848685838584858583878985848888878587888887898889898B8C868B8C8D888D8F8E898B8E8F88888F8F868A908E898E8E8E8D8F8F90C0AAC4C2E2E5E3E8ABD0ACB86F816F746869686A68686769686867686867676868676768676767686767686768676767686869686867696869686969696869686A696A6A00046400000064000000640000006400000064000000640000006400000064000000640000006400000064000000640000006400000064000000640000006400000064000000640000006400000064000000640000006400000000006400004B19006400000032320000191932000000640000006400000064000000640000006400000064000000640000006400000064000000640000006400000064000000640000060200000040320001D007000000006A02700264026C020401D7FE530178FEF7F7F8F7000000006400000000000000000000000700000005000000000000000000000000000000969A9B9A0000000000000000000000000000004100004218000000010F00000100000000000000000000000000000000000000000000000000000000000000000000001000040600120004000C005700710210011F0179FE0C01A1FE5D01B6FE30014CFF67017FFE3B019EFE50018FFE2D0191FE100298A8939A9FAEA2C2C699A5ACA6ADC9B01003878B858687867F888C818A888585888410044B0019004B1900004B1900004B00190000321B39E5C60000000000000000E5C61B39640A640A640A640A9FD79FD7612861280000C67D
这是byte[]序列化成base64后的形式
f3/fBAAPJABfAKEA4wGFAicDyQMjBCwEVARjBIUElwSpBLsEAAAiBU6RAAAEKAQAGAAMAANAAwHQBwAAAAcAAAAAXR0zAAAA9AEyAQAAKQAAAf9DTiMAAAUAdxsFABSAAF4AGQMFDwkHAAAAAGM6AAAlTRUAggAAAI0JAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIVGQMFDwkHAAAAAYEBhP7+ANf+XwGh/nYBq/5BAY3+kQGt/j4BhP4lAan+OAF6/jsBqv55AZr+FQHV/kYBrf4zAb/+ZAGL/g8Bu/5sAaL+CAGj/k0B1f4HAaD+agGz/oIBhP4iAYL+aAGW/i8BuP4fAaT+DAGm/mwBwP5HAaH+QwH3/jYBx/4KAaP+MQGr/koBfv59AaX+YwGd/nMBx/5RAZ3+SgHE/jwBnf4rAdn+RwGb/vYAGv8zAaD+AIAAgACAAIDMAACAWQFd/vEA1f5aAYf+x/yC/30AnP0Z/8H+vwAl/gCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAALMrdbQmsOrpryQqKKhuqGtnbWkmqK8n52tpK+3q5yxqa2vpayppqujn7aZkqmhp6yWma+Xp6GaraaUl5qupq2hn6CcoKG1rq+5vKWxqZegrpWarLGQoqGWGWomLmgceV/28vDu/7///0GoNoAgJBRCGhklHhkeFh0eGxQLEw8dHRYbGA0UDRYQDRcQFBMNERobGhIRHRAVDBIRExEQDxkQAAOOjJCQiYiKiY2GiIiIiYeHhYiHhoaGh4iHhYeKhoOFiYWEhYeDhIaFg4WEhYWDh4mFhIiIh4WHiIiHiYiJiYuMhouMjYiNj46Ji46PiIiPj4aKkI6Jjo6OjY+PkMCqxMLi5ePoq9CsuG+Bb3RoaWhqaGhnaWhoZ2hoZ2doaGdnaGdnZ2hnZ2hnaGdnZ2hoaWhoZ2loaWhpaWloaWhqaWpqAARkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAAABkAABLGQBkAAAAMjIAABkZMgAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAABkAAAAZAAAAGQAAAYCAAAAQDIAAdAHAAAAAGoCcAJkAmwCBAHX/lMBeP739/j3AAAAAGQAAAAAAAAAAAAAAAcAAAAFAAAAAAAAAAAAAAAAAAAAlpqbmgAAAAAAAAAAAAAAAAAAAEEAAEIYAAAAAQ8AAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAABAYAEgAEAAwAVwBxAhABHwF5/gwBof5dAbb+MAFM/2cBf/47AZ7+UAGP/i0Bkf4QApiok5qfrqLCxpmlrKatybAQA4eLhYaHhn+IjIGKiIWFiIQQBEsAGQBLGQAASxkAAEsAGQAAMhs55cYAAAAAAAAAAOXGGzlkCmQKZApkCp/Xn9dhKGEoAADGfQ==
1、如果仅希望忽略 byte[] 类型的字段数据,可以在该属性上添加 [JsonIgnore] 特性。这样,在生成的 JSON 数据中,将不会包含该字段的信息。

2、在进行JSON序列化时,默认情况下,byte[]类型的数据会被转换为base64编码。如果希望在序列化后的结果中保留byte[]类型的原始16进制数据,可以在相应的属性上添加一个JsonConverter。具体的代码示例如下:
/// <summary>
/// 自定义转换器:byte[] -> 16进制字符串(不转Base64)
/// </summary>
public class HexByteArrayConverter : JsonConverter<byte[]>
{
public override void WriteJson(JsonWriter writer, byte[] value, JsonSerializer serializer)
{
// 将byte[]转为十六进制字符串
writer.WriteValue(BitConverter.ToString(value).Replace("-", ""));
}
public override byte[] ReadJson(JsonReader reader, Type objectType, byte[] existingValue, bool hasExistingValue, JsonSerializer serializer)
{
// 从十六进制字符串转回byte[]
string hexString = reader.Value.ToString();
return Enumerable.Range(0, hexString.Length / 2)
.Select(i => Convert.ToByte(hexString.Substring(i * 2, 2), 16))
.ToArray();
}
}


浙公网安备 33010602011771号