C# 此类型的数据具有内置行为,不能以以下方式添加到模型:System.Int64

C# 此类型的数据具有内置行为,不能以以下方式添加到模型:System.Int64,c#,serialization,protobuf-net,C#,Serialization,Protobuf Net,此错误: Data of this type has inbuilt behaviour, and cannot be added to a model in this way: System.Int64 仅当以下行设置代理项类型long以供protobuf net在序列化具有时间戳类型的对象时使用时发生 RuntimeTypeModel.Default.Add(typeof(TimeStamp),false).SetSurrogate(typeof(long)); TimeStamp类定义

此错误:

Data of this type has inbuilt behaviour, and cannot be added to a model in this way: System.Int64
仅当以下行设置代理项类型long以供protobuf net在序列化具有时间戳类型的对象时使用时发生

RuntimeTypeModel.Default.Add(typeof(TimeStamp),false).SetSurrogate(typeof(long));
TimeStamp类定义了以下显式运算符:

public static explicit operator TimeStamp( long timeStamp)
{
    return new TimeStamp(timeStamp);
}

public static explicit operator long( TimeStamp TimeStamp)
{
    return TimeStamp.Internal;
}
那么为什么它不接受long作为TimeStamp的代理类型呢? 在开始尝试protobuf net之前,已经手动编写了序列化
在序列化/反序列化时,只要将代理项用作时间戳。

在当前时间,代理项行为应映射到“消息”类型(在protobuf术语中)。能够将其映射到诸如
long
之类的原语似乎是一种不同寻常的情况。我很可能会调整代码以使其正常工作,但是:很简单,这不是此功能的预期用例,因此它目前不支持此功能(消息和原语在存储内容方面有显著差异)

顺便说一句,根据您拥有的数量,您可以:

public TimeStamp Foo {get;set;}

[ProtoMember(n)]
private long FooValue {
    get { return (long)Foo; }
    set { Foo = (TimeStamp)value; }
}

今天我遇到了这个问题,我想投+1票来启用这个功能。我们在数据库层中使用强类型标识符,如果我们不必向每个包含标识符类型属性的protobuf serializable类添加垫片属性,那就太好了。这些标识符类型中的每一种都公开了与int的显式转换。