[英]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=="
}
是否可以使用$ type排除字节数组的JSON.NET序列化所有对象? 我可以在不向合同添加任何属性的情况下执行此操作(即我只想更改序列化程序设置)。
解决此问题的一种方法是使用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=="
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.