在没有 $type 的情况下序列化 JSON.NET 中的字节数组
Serialize byte array in JSON.NET without $type
我想使用 TypeNameHandling.Objects 序列化我所有带有 $type 引用的合同。但是,当使用此标志时,所有字节数组 (byte[]) 都使用 $value+$type 进行序列化。我仍然想要 Base64 编码但没有 $type。例如,对于以下合约:
class MyClass
{
public byte[] MyBinaryProperty {get;set;}
}
我得到:
{
"$type": "MyLib.MyClass, MyAssembly",
"MyBinaryProperty": {
"$type": "System.Byte[], mscorlib",
"$value": "VGVzdGluZw=="
}
}
我要:
{
"$type": "MyLib.MyClass, MyAssembly",
"MyBinaryProperty": "VGVzdGluZw=="
}
是否可以通过 JSON.NET 使用 $type 序列化所有对象,不包括字节数组?我可以在不向合同添加任何属性的情况下执行此操作吗(即我只想更改序列化程序设置)。
解决此问题的一种方法是为 byte[]
:
使用自定义转换器
public class ByteArrayConverter : JsonConverter
{
public override object ReadJson(
JsonReader reader,
Type objectType,
object existingValue,
JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(
JsonWriter writer,
object value,
JsonSerializer serializer)
{
string base64String = Convert.ToBase64String((byte[])value);
serializer.Serialize(writer, base64String);
}
public override bool CanRead
{
get { return false; }
}
public override bool CanConvert(Type t)
{
return typeof(byte[]).IsAssignableFrom(t);
}
}
通过这种方式,您可以覆盖 byte[]
的序列化方式并最终将序列化器传递给 string
而不是字节数组。
以下是您的使用方法:
string serialized = JsonConvert.SerializeObject(mc, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects,
Formatting = Newtonsoft.Json.Formatting.Indented,
Converters = new[] { new ByteArrayConverter() }
});
示例输出:
{
"$type": "UserQuery+MyClass, query_fajhpy",
"MyBinaryProperty": "AQIDBA=="
}
我想使用 TypeNameHandling.Objects 序列化我所有带有 $type 引用的合同。但是,当使用此标志时,所有字节数组 (byte[]) 都使用 $value+$type 进行序列化。我仍然想要 Base64 编码但没有 $type。例如,对于以下合约:
class MyClass
{
public byte[] MyBinaryProperty {get;set;}
}
我得到:
{
"$type": "MyLib.MyClass, MyAssembly",
"MyBinaryProperty": {
"$type": "System.Byte[], mscorlib",
"$value": "VGVzdGluZw=="
}
}
我要:
{
"$type": "MyLib.MyClass, MyAssembly",
"MyBinaryProperty": "VGVzdGluZw=="
}
是否可以通过 JSON.NET 使用 $type 序列化所有对象,不包括字节数组?我可以在不向合同添加任何属性的情况下执行此操作吗(即我只想更改序列化程序设置)。
解决此问题的一种方法是为 byte[]
:
public class ByteArrayConverter : JsonConverter
{
public override object ReadJson(
JsonReader reader,
Type objectType,
object existingValue,
JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(
JsonWriter writer,
object value,
JsonSerializer serializer)
{
string base64String = Convert.ToBase64String((byte[])value);
serializer.Serialize(writer, base64String);
}
public override bool CanRead
{
get { return false; }
}
public override bool CanConvert(Type t)
{
return typeof(byte[]).IsAssignableFrom(t);
}
}
通过这种方式,您可以覆盖 byte[]
的序列化方式并最终将序列化器传递给 string
而不是字节数组。
以下是您的使用方法:
string serialized = JsonConvert.SerializeObject(mc, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects,
Formatting = Newtonsoft.Json.Formatting.Indented,
Converters = new[] { new ByteArrayConverter() }
});
示例输出:
{
"$type": "UserQuery+MyClass, query_fajhpy",
"MyBinaryProperty": "AQIDBA=="
}