【问题标题】:protobuf-net encode DateTime UTC decode ToLocalTimeprotobuf-net 编码 DateTime UTC 解码 ToLocalTime
【发布时间】:2018-02-11 02:15:27
【问题描述】:

有没有办法让 protobuf-net 自动以 UTC 编码 DateTime 值,但使用 ToLocalTime 解码?

我在不同时区的系统之间传递消息,并希望我的 DTO' 中的每个 DateTime 属性都被序列化为 UTC(基本上在编码之前自动调用 ToUniversalTime)并在 LocalTime 中解码,以便自动接收消息的系统可以运行在 LocalTime 中的 DateTime 属性上,因此开发人员不必记住在每个属性上调用 ToLocalTime 以获取通过线路接收的 DTO?

【问题讨论】:

    标签: c# .net datetime protobuf-net


    【解决方案1】:

    对于这种类型的转换,通常的方法是具有两个属性:

    [ProtoMember(n, ...)]
    public DateTime When { get; set; }
    
    public DateTime WhenLocal => When.ToLocal(); // etc
    

    序列化器不会关心没有属性的那个。如果您真的不希望调用者使用它,则序列化器属性可以是私有的。

    【讨论】:

    • 谢谢 - 您有什么建议可以在不更改模型/DTO 的情况下实现相同的效果吗?
    • @TJF 部分课程?扩展方法?
    • 我真的很想在编码/解码级别上处理这个问题。我们使用多种编码协议来移动我们的 DTO,我们在那里实现了 DateTime 编码来自动为我们处理这个问题。我们现在希望在以相同方式使用我们预先存在的 DTO 的同时公开一个 protobuf 端点。 protobuf 库是否允许以某种方式覆盖类型的序列化/反序列化行为?
    • @TJF 目前没有;几乎可以肯定,在 3.0 里程碑中会有一个新的 API,因为关键的可交付成果是构建时 C# 序列化程序生成。基本上,想想IProtoSerializer<T> 提供自定义Serialize(ProtoWriter writer, in T obj)Deserialize(ProtoReader reader, ref T obj) 方法。同样的 API 可能还允许您注入自己的行为,尽管这只是一个愉快的副作用,而不是新 API 的主要目标。我目前没有 3.0 的 ETA
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 2012-05-01
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多