【问题标题】:Protobuf .NET serialization for inheritance classes继承类的 Protobuf .NET 序列化
【发布时间】:2018-06-28 23:22:25
【问题描述】:

我正在尝试将我的代码序列化程序从 NetDataContract 迁移到 Protobuf.Net。

让我们考虑以下类示例来帮助理解:

[DataContract(Name "a", IsReference = true)]
class Test
{
    [DataMember(Name = "a")]
    public int Id { get; set; }

    [DataMember(Name = "b")]
    public string Name { get; set; }
}

为了能够通过 DataContract 使用 Protobuf .NET,我使用了以下选项:

RuntimeTypeModel.Default.InferTagFromNameDefault = true;            
RuntimeTypeModel.Default.AutoAddProtoContractTypesOnly = false;

使用这些选项,上面显示的示例的序列化可以工作,但是当添加它的继承时,复杂性会增加。让我们用这个类改进我们的例子:

[DataContract(Name = "b", IsReference = true)]
class InheritanceTest : Test
{
    [DataMember(Name = "c")]
    public string Text { get; set; }
}

现在,为了能够序列化从“Test”继承的“InheritanceTest”类,我必须添加 ProtoInclude 参数(已经尝试仅使用 KnownType 但它不起作用)。类“测试”属性应该是这样的:

[DataContract(Name "a", IsReference = true)]
[KnownType(typeof(InheritanceTest)]
[ProtoInclude(<TAG>, typeof(InheritanceTest)]
class Test { ... }

恕我直言,复杂性在于您必须使用成员(DataMembers)自动分配订单中未自动使用的数字填充“TAG”。在此示例中,如果我使用 TAG=1 则会出错,因为属性 Id 已经使用它。与 TAG=2 和属性名称相同。所以我至少需要放 3 个。

没关系,这个类太简单了,但是当这个类有多个属性时该怎么办呢?每当我向其添加属性时,我是否应该更改 TAG?维护起来似乎很糟糕。

我怎样才能以更简单的方式做到这一点?我错过了什么吗?

考虑到它是自动分配的,它应该只执行一次并缓存。更好的是,它应该在编译时完成。

另外...为什么我不能使用 [KnownType] 属性,并且序列化程序会根据定义的类类型的 DataContract 的名称自动分配 TAG?请注意,使用 Name 自动分配 Order 的 DataMember 也会发生类似的情况。

【问题讨论】:

    标签: protobuf-net datacontract netdatacontractserializer


    【解决方案1】:

    但是当添加它的继承时,复杂性会增加。

    是的,确实如此。

    我应该在添加属性时更改 TAG 吗?

    您应该永远不要更改标签。永远。

    看起来维护起来很糟糕。

    没错。

    考虑到它是自动分配的,应该只执行一次并缓存。

    它是,在运行时。

    更好的是,它应该在编译时完成。

    嗯,我不关注“推断”方面,但总的来说这是我与编译器团队正在进行的讨论。

    我错过了什么吗?

    我想是的,是的;特别是,您不应该在永远会改变的模型上使用“按名称推断”选项。该选项被添加为一种实用的方式,只是让事情在现有的固定模型上运行,但它非常脆弱 - 并且在许多方面很危险。 应该在您的智能感知中出现关于此的警告,但坦率地说,推荐选项是:始终明确。将[ProtoMember(42)](或其他)添加到每个属性。这样就没有猜测,也没有添加破坏事物的新成员的风险。你可以看到一切,你可以理解一切。

    【讨论】:

    • 好吧,这回答了我的问题,我会接受它,我什至同意你的观点,但很遗憾,在考虑一个大型项目时,由于缺少一些东西,显然要花费太多的精力来尝试迁移解决方案。 :( 所以我可能需要退后一步放弃迁移,因为这会花费太多时间。我会检查是否值得,谢谢顺便说一句。
    猜你喜欢
    • 2012-12-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    相关资源
    最近更新 更多