假设我有一些数据
1: {
1: 0.0
2: 1
3: "2"
4: true
}
但是在编译时我不知道合同。但是,在运行时,我可以加载数据描述符,告诉我我有多少字段以及每个字段中的每种类型。即
new Type[]{
typeof(double),
typeof(int),
typeof(string),
typeof(bool)};
问:在运行时,我如何在给定数据描述的情况下从协议-bf读取(和写入)来自流的消息?
我目前的想法是:在运行时创建一个类型(emit)给定数据描述,然后使用protocol-buf序列化/反序列化。然后通过反射/动态访问属性。不知道这是不是一个好主意。
的替代方法答案 0 :(得分:3)
我想知道你最好的选择是使用扩展成员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字段外,还可以使用。