2015-08-31 52 views
0

我有一些字節數據,我想附加一些元數據並序列化爲某些標準的可互操作格式。我想我也許可以使用JSON做到這一點,在這種情況下,我想有一些像byte [] +元數據到json

{ 
    'metadata' : { /* ... */ }, 
    'data' : ??? 
} 

什麼是做到這一點的好辦法?

我認爲在做base64編碼數據,但後來我得出以下的東西:

class SerializationFormat { 
    MyMetaData metadata {get; set;} 
    string data {get; set;} 
} 

byte[] serialize(byte[] mydata, MyMetaData metadata){ 
    var obj = new SerializationFormat(){ 
    data = system.Convert.ToBase64String(mydata), 
    metadata = metadata 
    }; 
    //using json.net 
    string jsonstring = JsonConvert.SerializeObject(obj); 
    return System.Text.Encoding.UTF8.GetBytes(jsonstring); 
} 

我認爲這是相當愚蠢的;我正在採取字節數據,將其編碼爲base64,它保證位於7位ASCII內,將其編碼爲C#字符串(UTF-16),並再次將其解碼爲其原始表示。

有沒有更好的方法來做到這一點?

+0

Json.NET已經是'字節[]'財產轉換爲基64字符串,所以你可以跳過這一部分。請參見[序列化指南](http://www.newtonsoft.com/json/help/html/SerializationGuide.htm)。 – dbc

+0

此外,您可以直接流到['MemoryStream'](https://msdn.microsoft.com/en-us/library/system.io.memorystream%28v=vs.110%29.aspx),因爲顯示在[可以Json.NET序列化/反序列化到/從一個流?](http://stackoverflow.com/questions/8157636/can-json-net-serialize-deserialize-to-from-a-stream/17788118# 17788118),並跳過字符串表示。 – dbc

+0

@dbc我只看到它通過一個textwriter寫入,首先轉換爲UTF-16 base64,然後讓textwriters編碼器將其編碼回UTF8,而不是寫入'MemoryStream' – Martijn

回答

0

以下是將包含字節數據和元數據的對象直接序列化爲UTF-8編碼流的示例。 Json.Net處理字節數據的base-64編碼,所以你不需要預處理它。 (在內部,Json.Net有它自己的Base64Encoder類,它將字節數據以76個字符的塊編碼到JsonWriter中,所以你不需要擔心整個數組被無用地複製到內存中。)在這個例子中,我使用FileStream作爲輸出,但您可以將其替換爲您想要的任何類型的流。

class Program 
{ 
    static void Main(string[] args) 
    { 
     SerializationFormat obj = new SerializationFormat 
     { 
      metadata = new MyMetaData { foo = "xyz", bar = 12 }, 
      data = new byte[] { 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x21 } 
     }; 

     using (Stream stream = new FileStream(@"c:\temp\test.json", FileMode.Create)) 
     using (TextWriter textWriter = new StreamWriter(stream, Encoding.UTF8)) 
     using (JsonWriter jsonWriter = new JsonTextWriter(textWriter)) 
     { 
      JsonSerializer serializer = new JsonSerializer(); 
      serializer.Serialize(jsonWriter, obj); 
     } 
    } 
} 

public class SerializationFormat 
{ 
    public MyMetaData metadata { get; set; } 
    public byte[] data { get; set; } 
} 

public class MyMetaData 
{ 
    public string foo { get; set; } 
    public int bar { get; set; } 
} 

下面是被寫入到文件的輸出:

{"metadata":{"foo":"xyz","bar":12},"data":"SGVsbG8gV29ybGQh"}