gpt4 book ai didi

protobuf-net - 我可以使用 protobuf-net 序列化任意类型吗?

转载 作者:行者123 更新时间:2023-12-03 11:33:56 27 4
gpt4 key购买 nike

我正在尝试使用 protobuf-net 序列化一些对象,但不幸的是他们自由地使用了 DateTimeOffset , protobuf-net 尚不支持。这导致了很多:

No serializer defined for type: System.DateTimeOffset



我可以为未知类型定义自己的序列化例程吗? (之前问过 same question,但他的问题已经解决了。)

我正在使用最新的 protobuf-net beta , v2.0.0.431, 在 .NET 4 下,如果有关系的话。我也在使用运行时定义,所以我无法声明性地指定如何处理某些属性。

最佳答案

有两种方法可以解决未知“常见”类型的问题;第一种是使用 shim 属性,例如将值表示为类似内容的属性(例如 stringlong):

[ProtoMember(8)]
public string Foo {
get { ... read from the other member ... }
set { ... assign the other member ... }
}

另一种方法是代理,这是自动替换的第二个 protobuf 合约。使用代理的要求是:
  • 两种类型(例如, DateTimeOffsetDateTimeOffsetSurrogate )之间必须有定义的转换运算符(隐式或显式)
  • 然后你使用 SetSurrogate(surrogateType)教育protobuf-net,例如RuntimeTypeModel.Default.Add(typeof(DateTimeOffset), false).SetSurrogate(typeof(DateTimeOffsetSurrogate));

  • shim 属性更简单,但需要每个成员重复。代理会自动应用于模型中该类型的所有实例。然后代理遵循标准的 protobuf-net 规则,因此您将指示要序列化的成员等。

    编辑:添加代码示例

    using System;
    using ProtoBuf;

    [ProtoContract]
    public class DateTimeOffsetSurrogate
    {
    [ProtoMember(1)]
    public string DateTimeString { get; set; }

    public static implicit operator DateTimeOffsetSurrogate(DateTimeOffset value)
    {
    return new DateTimeOffsetSurrogate {DateTimeString = value.ToString("u")};
    }

    public static implicit operator DateTimeOffset(DateTimeOffsetSurrogate value)
    {
    return DateTimeOffset.Parse(value.DateTimeString);
    }
    }

    然后像这样注册

    RuntimeTypeModel.Default.Add(typeof(DateTimeOffset), false).SetSurrogate(typeof(DateTimeOffsetSurrogate));

    关于protobuf-net - 我可以使用 protobuf-net 序列化任意类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7046506/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com