Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在JSON.NET中序列化字节数组而不使用$type_C#_Json_Serialization_Json.net - Fatal编程技术网

C# 在JSON.NET中序列化字节数组而不使用$type

C# 在JSON.NET中序列化字节数组而不使用$type,c#,json,serialization,json.net,C#,Json,Serialization,Json.net,我想使用typenameholling.Objects用$type引用序列化我的所有合同。但是,使用此标志时,所有字节数组(字节[])都使用$value+$type进行序列化。我仍然需要Base64编码,但不需要$type。例如,对于以下合同: class MyClass { public byte[] MyBinaryProperty {get;set;} } 我得到: { "$type": "MyLib.MyClass, MyAssembly", "MyBinaryProper

我想使用typenameholling.Objects用$type引用序列化我的所有合同。但是,使用此标志时,所有字节数组(字节[])都使用$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(不包括字节数组)序列化所有对象?我是否可以在不向协定添加任何属性的情况下执行此操作(即,我只想更改序列化程序设置)。

解决此问题的一种方法是为
字节[]使用自定义转换器。

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 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=="
}

示例:

@Hexxagonal:这不是OP要问的问题可能
json
想让您知道它是
mscorlib
中定义的
字节[]
。不sure@Hexxagonal当前位置这不是那个问题的翻版。太快了!我必须承认我目瞪口呆。。。非常聪明。它确实工作得很好。@KarolKolenda:谢谢!很乐意帮忙