【问题标题】:protobuf versions and DateTimeOffsetprotobuf 版本和 DateTimeOffset
【发布时间】:2019-01-15 21:41:28
【问题描述】:

我有一个使用 protobuf-net 版本 1.0.0.278 的应用程序,并且我有一个包含此字段的对象:

    [ProtoBuf.ProtoMember(6)]
    public virtual DateTimeOffset? CreatedDate { get; set; }

我不确定在序列化/反序列化包含它的对象时这是否被正确序列化和反序列化,但是这两个操作都没有引发异常。

最近我更新到 protobuf-net 版本 2.0.0.621,现在我得到一个 System.InvalidOperationException 调用 ProtoBuf.Serializer.PrepareSerializer。消息显示“没有为类型定义序列化程序:System.Nullable`1[[System.DateTimeOffset, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]”。

是否有 protobuf-net 原生方式来序列化这种类型?这种行为有什么改变的原因吗?

【问题讨论】:

标签: protobuf-net datetimeoffset


【解决方案1】:

我创建了这个代理类:

[ProtoContract]
public class DateTimeOffsetProxy
{
    [ProtoMember(1)] public DateTime UtcTime;
    [ProtoMember(2)] public TimeSpan Offset;

    public static implicit operator DateTimeOffsetProxy(DateTimeOffset value)
    {
        return new DateTimeOffsetProxy()
        {
            UtcTime = value.UtcDateTime,
            Offset = value.Offset
        };
    }

    public static implicit operator DateTimeOffset(DateTimeOffsetProxy value)
    {
        var result = new DateTimeOffset(value.UtcTime);
        return result.ToOffset(value.Offset);
    }
}

然后我就注册了:

        Model = RuntimeTypeModel.Default;
        Model.Add(typeof(DateTimeOffset), 
                  false).SetSurrogate(typeof(DateTimeOffsetProxy));

这似乎工作得很好。

【讨论】:

    猜你喜欢
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    相关资源
    最近更新 更多