如何序列化一個類的Stream(或更加正確的Stream derived)數據成員?Protobuf-net:使用Stream數據成員對第三方類進行序列化
假設我們有,我們不能屬性的第三方類:
public class Fubar
{
public Fubar() { ... }
public string Label { get; set; }
public int DataType { get; set; }
public Stream Data { get; set; } // Where it's always actually MemoryStream
};
我試圖使用protobuf網序列化類。通過例外和我提出的各種SO問題:
RuntimeTypeModel.Default.Add(typeof(Stream), true)
.AddSubType(1, typeof(MemoryStream));
RuntimeTypeModel.Default.Add(typeof(Fubar), false)
.Add(1, "Label")
.Add(2, "DataType")
.Add(3, "Data");
using (MemoryStream ms = new MemoryStream())
{
Fubar f1 = new Fubar();
/* f1 initialized */
// Serialize f1
Serializer.SerializeWithLengthPrefix<Message>(ms, f1, PrefixStyle.Base128);
// Now let's de-serialize
ms.Position = 0;
Fubar f2 = Serializer.DeserializeWithLengthPrefix<Fubar>(ms, PrefixStyle.Base128);
}
以上運行沒有錯誤。 Label和DataType在f2中是正確的,但Data變量只是一個空的流。調試代碼我發現內存流類似於29個字節(而f1中的數據流本身大於77KiB)。
我覺得好像我錯過了一些相當微不足道的東西,但似乎無法弄清楚它會是什麼。我認爲確實可以序列化一個流數據成員。我是否也可能以某種方式指定Stream或MemoryStream類型的數據屬性?
感謝您的快速響應。那當然是我錯過的「簡單的東西」。我希望不必去替代路線,因爲涉及的實際類有20-30個屬性,根據配置/過濾器,其中一些可能或可能不會被設置/使用。 是否沒有辦法爲Stream或MemoryStream類指定某種代理來幫助序列化/反序列化? – CWoods
@CWoods ...好吧,也許你可以替代流?但是這個建議讓我想要抓住我的手...... –
不希望你失去雙手......只是不知道是否有一種方法可以讓助手進入基於類類型的組合我避免了整個數據類的代理路線。我會咬緊牙關,爲整個事情創造一個替代品。 – CWoods