2015-06-12 29 views
4

我想使用TypeNameHandling.Objects將所有我的合約與$ type引用序列化。但是,使用此標誌時,所有字節數組(byte [])都使用$ value + $ type進行序列化。我仍然希望Base64編碼,但沒有$類型。例如,對於以下合同:

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序列化所有對象$類型排除字節數組?我可以在不向合約添加任何屬性的情況下執行此操作(即,我只想更改串行器設置)。解決這個問題

+0

@Hexxagonal:這不是什麼OP是問 –

+0

也許' json'想讓你知道它是'mscorlib'中定義的'byte []'。不確定 –

+0

@Hexxagonal:這不是該問題的重複。 – StriplingWarrior

回答

3

一種方法是使用自定義轉換器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==" 
} 

例子:https://dotnetfiddle.net/iDEPIT

+0

很快!我必須承認我是個快活的人......非常聰明。它確實工作得很好。 –

+0

@KarolKolenda:謝謝!樂意效勞 –