protobuf-net 預設只支援序列化至 stream,或是自 stream 姐序列化回物件。使用上就是透過 Serializer.Serialize 帶入 stream 與物件,帶入的物件就會被序列化至 stream,呼叫 Serializer.Deserialize,帶入 stream,泛型型態設定為指定的類別型態,就可以自 stream 解序列化回指定型態的物件。

private static void SerializeToStream(T obj, Stream stream) {
Serializer.Serialize(stream, obj);
}

private static T DeSerializeFromStream(Stream stream) {
return Serializer.Deserialize(stream);
}

如果要序列化為字串,可以將物件先序列化到 stream,然後將他轉成 Base 64 的字串。解序列化反向操作即可。

private static string SerializeToText(T obj) {
using (var ms = new MemoryStream(1024)) {
SerializeToStream(obj, ms);
return Convert.ToBase64String(ms.ToArray());
}
}

private static T DeSerializeFromText(string text) {
var buffer = Convert.FromBase64String(text);
using (var ms = new MemoryStream(buffer)) {
return DeSerializeFromStream(ms);
}
}

序列化到檔案的話,就是開啟檔案串流,將物件序列化到檔案串流即可。解序列化一樣反向操作。

public virtual void SerializeToFile(T obj, String file, Int32 bufferSize = 1024) {
using (var fs = File.Open(file, FileMode.Create, FileAccess.Write)) {
using (var bs = new BufferedStream(fs, bufferSize)) {
SerializeToStream(obj, bs);
bs.Flush();
}
}
}
public virtual T DeSerializeFromFile(String file, Int32 bufferSize) {
using (var fs = File.Open(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) {
using (var bs = new BufferedStream(fs, bufferSize)) {
return DeSerializeFromStream(bs);
}
}
}