2012-02-11 79 views
2

我们使用protobuf-net(并且爱它!)。我们现在有一个从父级基类派生的protocontract-decorated子类,它不是protocontract装饰的。Protobuf-net包含不可序列化基类的特定成员

我们试图让子类对一些父类的字段进行序列化/反序列化。

public abstract class TableServiceEntity 
{ 
    public virtual string PartitionKey { get; set; } 
    public virtual string RowKey { get; set; } 
    public DateTime Timestamp { get; set; } 
} 

[ProtoContract] 
public class IndicatorStreamIndex : TableServiceEntity 
{ 
    // protomember properties 
} 

我们如何获得IndicatorStreamIndex来序列化/反序列化PartitionKey,RowKey和Timestamp?

最佳, 迈克

+0

稍后会试几件事... – 2012-02-11 20:00:30

+0

Marc,谢谢!期待你的回复。 – ionwarp 2012-02-11 23:33:40

+0

可以澄清:您使用的是哪个版本的protobuf-net?可用的不同功能,等 – 2012-02-12 14:41:13

回答

2

这可以在v2中很容易地进行配置,使用RuntimeTypeModel在运行时调整配置:

// this should only be done once per AppDomain, usually at app startup 
RuntimeTypeModel.Default.Add(typeof (IndicatorStreamIndex), true) 
    .Add("PartitionKey", "RowKey", "Timestamp"); 

// then when needed: 
var obj = new IndicatorStreamIndex 
{ 
    RowKey = "abc", 
    PartitionKey = "def", 
    Timestamp = DateTime.Today 
}; 
var clone = Serializer.DeepClone(obj); 
Console.WriteLine(clone.RowKey); // "abc" 
Console.WriteLine(clone.PartitionKey); // "def" 
Console.WriteLine(clone.Timestamp); // 13/02/2012 
+0

Marc,非常感谢!将很快实施,让你知道它是如何发展的。 – ionwarp 2012-02-19 18:47:18

2

第一关 - 我认为你有技术基础上发展起来的优秀的串行器。也就是说,我发现ProtoBuf序列化的各个方面如此不切实际,以致于我无法看到自己在当前状态下使用它。

让我限定 - 首先,明确需要让ProtoBuf属性在类上进行序列化以强制ProtoBuf部署依赖;而序列化背后的基本思想之一就是可以采用相同的类,并且在需要/需要时将串行器(一个或多个)扫出 - 这意味着属性和dll可能不需要用于不同的部署。

第二关 - 与ProtoBuf不默认递归继承树使它更具体Protobuf - 意味着更多的代码混乱,更具体的代码依赖等这是一个非常明显的缺陷,在我看来,好像一个派生B从A开始,那么当序列化B时,自然希望包含A的属性 - 没有上面线程中显示的自定义代码。

第三 - 自己想象一下,不需要属性......然后你也可以画出自己从对象序列化的例子, object []参数 - 哪个ProtoBuf当前不能执行。我猜想(不是我自己的序列化专家),它可能就像将类和程序集作为序列化对象的一部分来远程解析它一样简单 - 请记住,同一个库也必须驻留在那里。换句话说,基于远程计算机上存在相同类型的名称和程序集的假设,可以序列化任何类型/类型层次结构,而无需显式属性。

Marc,祝你好运。

Gawie

+0

我想我看着它错误的方式......回想起来,它可能更多的是一个跨语言交流工具,而不是一个.NET功能丰富的序列化sdk ... – user1210708 2012-10-08 18:07:49

相关问题