簡體   English   中英

protobuf-net是否支持ArraySegment(還?)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM