编程语言
首页 > 编程语言> > c# – 使用Protobuf-Net序列化运行时消息协议

c# – 使用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序列化/反序列化.然后通过反射/动态访问属性.不知道这是不是一个好主意.

这是从Serialize object[] with Protobuf-net开始的另一种方法

解决方法:

我想知道你最好的选择是使用扩展成员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.可扩展只是方便.请注意,IExtensible除了已在类型上声明的任何protobuf字段外,还可以工作.

标签:c,protocol-buffers,protobuf-net
来源: https://codeday.me/bug/20190628/1320776.html