Protobuf net 我可以在没有完整类型定义的情况下使用protobuf net作为类似SAX的解析器吗?

Protobuf net 我可以在没有完整类型定义的情况下使用protobuf net作为类似SAX的解析器吗?,protobuf-net,Protobuf Net,有人提到protobuf-net可以像SAX解析器一样使用,但我找不到不需要对解析对象进行或多或少完整描述的示例 (跳到第2点)对于问题,1)仅提供一些上下文) 1)也许我应该先提供一些上下文: 我目前在项目中使用JSON.Net,并创建了几个JSONConverter来定制各种类型的序列化方式——基本上所有主要类型都有手写的序列化指令(ReadProperty、ReadValue等) 我这样做的原因和地点: 我有一个元类型类,它描述某些值对象在运行时的行为。这些Value对象具有序列化的Ty

有人提到protobuf-net可以像SAX解析器一样使用,但我找不到不需要对解析对象进行或多或少完整描述的示例

(跳到第2点)对于问题,1)仅提供一些上下文)

1)也许我应该先提供一些上下文:

我目前在项目中使用JSON.Net,并创建了几个JSONConverter来定制各种类型的序列化方式——基本上所有主要类型都有手写的序列化指令(ReadProperty、ReadValue等)

我这样做的原因和地点:

  • 我有一个
    元类型
    类,它描述某些
    对象在运行时的行为。这些
    Value
    对象具有序列化的
    Type
    属性。序列化此属性时,转换器仅返回
    元类型的名称
    ,反序列化时使用该名称获取相应的INF
    元类型
    。这样做的原因是类型的名称已经足够了,
    元类型
    类过于繁琐,无法序列化,并且生成的JSON更加紧凑
  • 有几个对象的集合包含不需要序列化的值,因为当它们不存在时,我可以基于
    元类型重新创建它们。转换器过滤这些集合并只存储那些不是默认值的值–虽然JSON.Net的属性在设置为默认值时会阻止属性序列化,但我不知道有任何内置方法可以过滤集合中的默认值
我的目标是什么:

既然我已经有了这么多手写的seralization代码,我想摆脱或映射器。这样做的原因是我可以更容易地创建迁移器,它可以读取旧的JSON格式并执行必要的迁移步骤(添加数据、忽略不再需要的数据等)。使用OR映射器,我需要旧类型解析旧格式,然后将旧类型转换为新类型——这是一种有效的策略,但因为我有手写代码,所以我可以执行非常精细的迁移步骤,并对几乎任何更改做出反应。 基本上更强大,我不需要旧的对象模型

2)那么实际的问题是什么

我可以使用protobuf net或多或少地从流手动读/写数据吗 以其他方式(例如RuntimeTypeModel?)对(反)序列化具有类似的能力

要使用上面的示例,请执行以下操作:


  • 我有一个属性类型为
    元类型
    的对象,但我不想序列化整个
    元类型
    ,我只想存储一个字符串或ID。反序列化时,字符串或ID用于获取正确的
    元类型
    (大部分都是可能的。在最原始的级别,ProtoReader有一个完整的API用于读取底层流。如果您知道您只想读取“字段1作为预期的”(对于版本等),您可以使用它设置一个模型,并让库执行繁重的工作:

    [ProtoContract] class VersionStub {
        [ProtoMember(1)] public int Version {get;set;}
    }
    
    如果同一模型有多个不兼容的版本,则可以分别创建和使用不同的RuntimeTypeModel实例(为了提高性能,仍应缓存和重用模型)

    然而,API是基于预先存在的具体类型的-它允许您在运行时配置映射,但它当前不会动态创建DTO类型。它可以。尽管如此-它已经有足够多的内置元编程了


    我回答了这个问题吗?还是另一个问题?

    这大部分是可能的。在最原始的层次上,ProtoReader有一个完整的API来读取底层流。如果您知道您只想阅读“字段1作为预期的”(对于版本等),您可以设置一个模型,并让库来完成繁重的工作:

    [ProtoContract] class VersionStub {
        [ProtoMember(1)] public int Version {get;set;}
    }
    
    如果同一模型有多个不兼容的版本,则可以分别创建和使用不同的RuntimeTypeModel实例(为了提高性能,仍应缓存和重用模型)

    然而,API是基于预先存在的具体类型的-它允许您在运行时配置映射,但它当前不会动态创建DTO类型。它可以。尽管如此-它已经有足够多的内置元编程了


    我回答了这个问题吗?还是另一个问题?

    谢谢你的快速回答,Marc–我想我的问题又太模糊了。你可以详细说明一下迁移部分吗:我更喜欢只有一组DTO用于反序列化,因为有很多泛型类,其中涉及许多可能的类型参数。我可以合作吗配置一个
    RuntimeTypeModel
    ,以便将旧格式解析为新的DTO?例如,是否可以为已添加到新DTO的特定属性提供默认值,或者只是
    default(T)
    反序列化后?如果不可能的话,我更感兴趣的是
    ProtoReader
    以及如何使用它–是否有任何示例或现有项目在“原始”阶段使用它级别?我不需要解析器来动态创建DTO,我可以读取所有值并自己创建DTO–这样我就可以控制如何准确处理旧格式、如何转换旧值或将哪些值用于新添加的属性。@enzi有一个DataTable处理程序,显示原始API用法;链接自.Re“旧格式”-这取决于你对它做了多少更改!如果你将
    浮点
    更改为
    字符串
    ,那么内置的任何东西都帮不上忙。太好了!这正是我想要的。除了组和子项的确切含义之外,代码也非常简单,但我可以找到