簡體   English   中英

使用Protobuf-Net序列化運行時消息協定

[英]Serialize a Run-Time Message Contract with Protobuf-Net

可以說我有一些數據

1: {
    1: 0.0
    2: 1
    3: "2"
    4: true
}

但在編譯時我不知道合同。 但是,在運行時,我可以加載一個數據描述符 ,告訴我我有多少字段以及每個字段中的每種類型。

new Type[]{
   typeof(double),
   typeof(int),
   typeof(string),
   typeof(bool)};

問:在運行時,如何在給定數據描述的情況下從協議文件中讀取(和寫入)消息?

我目前的想法是:在運行時創建一個類型(emit)給定數據描述然后使用protocol-buf序列化/反序列化。 然后通過反射/動態訪問屬性。 不知道這是不是一個好主意。

這是使用Protobuf-net的Serialize object []的另一種方法

我想知道你最好的選擇是使用擴展成員API嗎? 就像是

[TestFixture]
public class SO25179186
{
    [Test]
    public void RuntimeMessageContract()
    {
        var adhoc = new AdHoc();
        Extensible.AppendValue<double>(adhoc, 1, 0.0);
        Extensible.AppendValue<int>(adhoc, 2, 1);
        Extensible.AppendValue<string>(adhoc, 3, "2");
        Extensible.AppendValue<bool>(adhoc, 4, true);

        var clone = Serializer.DeepClone(adhoc);
        Assert.AreNotSame(clone, adhoc);
        Assert.AreEqual(0.0, Extensible.GetValue<double>(clone, 1));
        Assert.AreEqual(1, Extensible.GetValue<int>(clone, 2));
        Assert.AreEqual("2", Extensible.GetValue<string>(clone, 3));
        Assert.AreEqual(true, Extensible.GetValue<bool>(clone, 4));
    }

    [ProtoContract]
    class AdHoc : Extensible {}
}

protobuf-net目前沒有其他“adhoc對象定義”API。 但是,上面的變體可以使用Type而不是泛型。

請注意,您不必從繼承Extensible ; 您也可以手動實現IExtensible Extensible只是方便。 請注意, IExtensible 除了已在類型上聲明的任何protobuf字段外,還可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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