byte [] +元数据到json

时间:2015-08-31 09:52:09

标签: c# json serialization encoding json.net

我有一些字节数据,我想将一些元数据附加到一些标准的可互操作格式并序列化。我想我可以用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),然后再将其解码为原始表示。

有更好的方法吗?

1 个答案:

答案 0 :(得分: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"}