首页 文章

JsonConverter byte []

提问于
浏览
1

我有以下代码:

//楷模

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));
    }
}

// Serialize(调用ByteArrayConverter的WriteJson函数,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函数,因此它不会转换回byte [],生成另一个无效的[]字节,....

知道这个问题吗?

1 回答

  • 0

    老问题,但需要澄清

    当我不使用上述内容时,它使用以下信息序列化一个byte []类型:$ type:“System.Byte [],mscorlib”$ Value:“VABlAHMAdABlAA ==”,但是当我去反序列化时显示错误:解析值时遇到意外的字符

    要避免反序列化中出现上述错误,请在反序列化中使用以下json设置 .

    TypeNameHandling = TypeNameHandling.None
    

    TypeNameHandling设置包括序列化JSON时的类型信息和读取类型信息,以便在反序列化JSON时创建创建类型

    欲了解更多详情,请阅读:TypeNameHandling Enumeration

    byte []的序列化是Base-64字符串,当反序列化时,它再次生成byte [] .

    你不需要在@Brian Rogers和@dbc的评论中给出的ByteArrayConverter

    你可以找到a complete working example using your code with modification online

相关问题