我有一些字节数据,我想将一些元数据附加到一些标准的可互操作格式并序列化。我想我可以用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 :(得分: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"}