我有以下代码:
//模型
public class Home{
public Guid HomeId { get; set; }
public Guid UserId { get; set; }
public string Name { get; set; }
public byte[] Description1 { get; set; }
public virtual User User { get; set; }
}
public class User
{
public Guid UserId { get; set; }
public string Email { get; set; }
public virtual Perfil Perfil { get; set; }
}
public class Perfil
{
public Guid UserId { get; private set; }
public string Name { get; private set; }
public byte[] Description2 { get; set; }
}// JsonConverter
public class ByteArrayConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(byte[]);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
return null;
var m = Convert.FromBase64String((string)reader.Value);
return m;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
byte[] bytes = (byte[])value;
writer.WriteValue(Convert.ToBase64String(bytes));
}
}//序列化(调用WriteJson函数的ByteArrayConverter,OK)
var serialized = JsonConvert.SerializeObject(obj, settings);
{
"HomeId": "2925362b",
"UserId": "9ea43c30",
"Name": "Name 1",
"Description1": "VABlAHMAdABlAA==", //===> Converts to Base64 (OK)
"User": {
"UserId": "9ea43c30",
"Email": "aaaa@aaaa.com",
"Perfil": {
"UserId": "9ea43c30",
"Name": "Name 2",
"Description2": "dABlAHMAdABlAA==", //===> Converts to Base64 (OK)
}
}}
//反序列化
var deserialized = JsonConvert.DeserializeObject<T>(serialized, settings); // T is class Home
{
"HomeId": "2925362b",
"UserId": "9ea43c30",
"Name": "Name 1",
"Description1": "VABlAHMAdABlAA==", //===> Don't Convert from Base64, (**Does not call the ReadJson function of ByteArrayConverter**)
"User": {
"UserId": "9ea43c30",
"Email": "aaaa@aaaa.com",
"Perfil": {
"UserId": "9ea43c30",
"Name": "Name 2",
"Description2": "dABlAHMAdABlAA==", //===> Convert from Base64 (OK)
}
}}
设置
var settings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
Formatting = Formatting.Indented
};
settings.Converters.Add(new ByteArrayConverter());Description1属性不会进入ByteArrayConverter类的ReadJson函数,因此它不会转换回字节[],从而生成另一个无效的[]字节,.
对这个问题有什么想法吗?
发布于 2017-09-11 21:02:48
老问题,但需要澄清
当我不像上面那样使用时,它用以下信息序列化一个byte[]类型:$ type:"System.Byte [],mscorlib“$ Value:"VABlAHMAdABlAA ==",但是当我去反序列化时,它显示了一个错误:解析值时遇到的意外字符
若要避免反序列化中出现上述错误,请在反序列化中使用以下json设置。
TypeNameHandling = TypeNameHandling.NoneTypeNameHandling设置包括序列化JSON时的类型信息和读取类型信息,以便在反序列化JSON时创建创建类型
欲了解更多详细信息,请阅读:TypeNameHandling枚举
byte[]的序列化是Base-64字符串,当反序列化时它再次生成byte[]。
您不需要像@Brian和@dbc的评论中给出的ByteArrayConverter那样
你可以找到使用在线修改的代码的完整工作示例
https://stackoverflow.com/questions/42865402
复制相似问题