[英]Does protobuf-net support ArraySegment (yet?)
我已經閱讀了Protobuf-net memcache提供程序在append / set ArraySegment上失敗,它表示可能在某些時候支持它。
我也嘗試過該問題中建議的測試,這表明版本2.0.0.668不支持它。
有沒有人使用帶有protobuf-net的ArraySegments成功,或者有想法通過線路發送字節數組的有效方法。
即我有這樣一個對象:
[ProtoContract]
class Foo
{
[ProtoMember(1)]
public byte[] Data { get; set; }
}
我想將一個不同的對象T序列化為一個字節數組,將其分配給Data,然后將Foo序列化為另一個byte []。 (聽起來不盡如人意,但Foo類必須與該類型無關,它可能是通用的嗎?)。
關鍵是我寧願最小化分配/ GC,所以我希望每次序列化數據時最小化數組的復制或新的分配。
下面是一些示例代碼,演示了我想要更有效地實現的目標:
public class DataSender<T>
{
private ISerializer serializer; //Could be any kind of binary serializer
public void Send(T obj)
{
MemoryStream serializationBuffer = new MemoryStream(); // Inefficent allocation
serializer.Serialize(serializationBuffer, obj);
var sendable = new Foo(){ Data=serializationBuffer.ToArray() } // Inefficent copy
Sender.Send(sendable);
}
}
我非常歡迎任何有關替換我的Foo對象和/或發送代碼的建議。
這看起來對我來說過於復雜。 我認為你讓Foo
通用的想法非常好,所以你可以:
[ProtoContract]
class Foo<T>
{
[ProtoMember(1)]
public T Data { get; set; }
}
然后,您將使用簡單的代碼實例化一個新的Object,如:
var foo = new Foo<Bar>() { Data = new Bar() { Data = "Some Data" } };
但是,根據您的其他注釋,您無法保證對象是可序列化的,或具有proto屬性。 例如,bar類看起來像:
class Bar
{
public string Data { get; set; }
}
在這種情況下,您可以使用RuntimeTypeModel
類在運行時配置序列化。
以下是使用protobuf和數據對象的動態運行時配置的完整序列化和反序列化的示例:
using (var serializationBuffer = new MemoryStream())
{
var foo = new Foo<Bar>() { Data = new Bar() { Data = "Some Data" } };
RuntimeTypeModel.Default.Add(foo.Data.GetType(), false)
.Add(foo.GetType().GetProperties().Select(p => p.Name).ToArray());
Serializer.Serialize(serializationBuffer, foo);
serializationBuffer.Seek(0, SeekOrigin.Begin);
var deserialized = Serializer.Deserialize<Foo<Bar>>(serializationBuffer);
}
這樣,即使沒有序列化屬性,也可以使用任何對象作為數據對象。 但是,您將受到性能損失,因為反射用於發現類型屬性。 但是,您應該獲得所需的靈活性 。
使用WCF通過線路發送此對象的正確方法是使用protobuf ProtoEndpointBehavior
配置WCF自定義行為,然后WCF將使用protobuf自動序列化和反序列化您的Foo對象。 這意味着客戶端只會確保它使用用proto屬性修飾的對象,並通過網絡發送它們。 WCF將負責序列化/反序列化。
以下是如何使用WCF protobuf服務的綜合示例:
http://www.drdobbs.com/windows/working-with-protobuf-wcf-services/240159282?pgno=1
通過線路發送數據的效率取決於許多因素。 如果要通過線路發送大對象,可以將WCF TransferMode
設置為使用Streaming,然后在另一端讀取字節數組塊中的數據。
但是,效率是你應該衡量的,而不是假設的 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.