C# 使用Protobuf Net序列化运行时消息协定

C# 使用Protobuf Net序列化运行时消息协定,c#,protocol-buffers,protobuf-net,C#,Protocol Buffers,Protobuf Net,假设我有一些数据 1: { 1: 0.0 2: 1 3: "2" 4: true } 但在编译时我不知道合同。但是,在运行时,我可以加载一个数据描述符,它告诉我有多少字段以及每个字段中的每种类型。i、 e new Type[]{ typeof(double), typeof(int), typeof(string), typeof(bool)}; Q:在运行时,如何让协议buf读取(和写入)给定数据描述的流中的消息? 我目前的想法是:根

假设我有一些数据

1: {
    1: 0.0
    2: 1
    3: "2"
    4: true
}
但在编译时我不知道合同。但是,在运行时,我可以加载一个数据描述符,它告诉我有多少字段以及每个字段中的每种类型。i、 e

new Type[]{
   typeof(double),
   typeof(int),
   typeof(string),
   typeof(bool)};
Q:在运行时,如何让协议buf读取(和写入)给定数据描述的流中的消息?

我目前的想法是:根据数据描述在运行时创建一个类型(emit),然后让协议buf序列化/反序列化。然后通过反射/动态访问属性。但不确定这是否是个好主意


这是

中的另一种方法,我想知道您的最佳选择是否是只使用扩展成员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 {}
}
[TestFixture]
公共类SO25179186
{
[测试]
public void RuntimeMessageContract()
{
var adhoc=新的adhoc();
可扩展的.AppendValue(即席,1,0.0);
可扩展。附加值(临时,2,1);
可扩展。附加值(临时,3,“2”);
Extensible.AppendValue(临时,4,true);
var clone=Serializer.DeepClone(即席);
Assert.AreNotSame(克隆,临时);
AreEqual(0.0,Extensible.GetValue(clone,1));
AreEqual(1,Extensible.GetValue(clone,2));
Assert.AreEqual(“2”,可扩展的.GetValue(克隆,3));
AreEqual(true,Extensible.GetValue(clone,4));
}
[原始合同]
类:可扩展{}
}
protobuf net中目前没有其他“临时对象定义”API。但是,上面的一些变体可用于
类型
而不是泛型


请注意,您不必从可扩展的
继承;您还可以手动实现
ieextensible
<代码>可扩展
只是方便地实现了这一点。请注意,
ieextensible
除了在类型上声明的任何protobuf字段之外,还可以工作。

几乎在那里,但我需要使用非泛型:
Extensible.AppendValue(model,adhoc,1,DataFormat.Default,Activator.CreateInstance(expectedType))。。。这也行。:)如果我选择使用可扩展类,而不是发出动态类,我会受到性能惩罚吗?i、 反序列化程序没有编译,等等?