Protobuf-net 包括不可序列化基类的特定成员

Posted

技术标签:

【中文标题】Protobuf-net 包括不可序列化基类的特定成员【英文标题】:Protobuf-net include specific member of non-serializable base class 【发布时间】:2012-02-11 17:14:02 【问题描述】:

我们正在使用 protobuf-net(并且喜欢它!)。我们现在有一个从父基类派生的 protocontract-decorated 子类,它不是 protocontract-decorated。

我们正在尝试让子类序列化/反序列化一些父类的字段。

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?

最好, 迈克

【问题讨论】:

一会儿会尝试一些事情...... 马克,谢谢!期待您的回复。 您能否澄清一下:您使用的是哪个版本的 protobuf-net?可用的不同功能等 嗨,Marc,我们愿意使用任何稳定版本。当前使用:1.0.0.282。 k;这个周末我很少在电脑前——这个星期一上午可以看;我怀疑在没有任何代码更改的情况下使用 v2 会很容易 - 看起来 【参考方案1】:

这可以在 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

【讨论】:

马克,非常感谢!很快就会实施,并告诉您进展如何。【参考方案2】:

首先,我认为您具备开发优秀序列化程序的技术基础。也就是说,我发现 ProtoBuf 序列化的各个方面非常不切实际,以至于我看不到自己在当前状态下使用它。

让我有资格 - 首先,明确需要在类上具有 ProtoBuf 属性以使其序列化强制 ProtoBuf 部署依赖项;虽然序列化背后的基本思想之一是可以采用相同的类,并在需要时替换序列化器 - 这意味着不同的部署可能不需要属性和 dll。

第 2 关 - ProtoBuf 默认情况下不递归继承树使得它更加特定于 Protobuf - 意味着代码中更混乱,更具体的代码依赖等。在我看来,这是一个非常明显的缺陷,就好像一个派生 B来自 A,那么人们自然会希望在序列化 B 时包含 A 的属性 - 没有上面线程中显示的自定义代码。

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

Marc,祝你实施顺利。

盖伊

【讨论】:

我想我看错了...回想起来,它可能更像是一种跨语言通信工具,而不是 .NET 功能丰富的序列化 sdk...

以上是关于Protobuf-net 包括不可序列化基类的特定成员的主要内容,如果未能解决你的问题,请参考以下文章

Protobuf-net 创建具有接口和抽象基类的类型模型

仅在 ProtoBuf-net 中序列化基类

protobuf-net 序列化为基类

如何停止使用 Protobuf-Net 继承,直接使用继承类?

限制 protobuf-net 继承“树”

基类和继承类的 XML 序列化信息