Protobuf net Protobuf net-什么是序列化的?

Protobuf net Protobuf net-什么是序列化的?,protobuf-net,Protobuf Net,我试图用Proto-buf替换现有的序列化。问题是,我们目前使用ISerializable检查数据是否已更改,并且仅在数据已更改时序列化原始值。这是通过使用两个可为空的变量来完成的,并且如果值已更改,则仅将ISerializable.GetObjectData中的原始值添加到info对象 反序列化时,在ISerializable构造函数中,我读取SerializationInfo以查找哪些成员已序列化,哪些未序列化。如果原始值未序列化,则将其值设置为当前值。(因此,由于未序列化而节省资源) Pr

我试图用Proto-buf替换现有的序列化。问题是,我们目前使用ISerializable检查数据是否已更改,并且仅在数据已更改时序列化原始值。这是通过使用两个可为空的变量来完成的,并且如果值已更改,则仅将ISerializable.GetObjectData中的原始值添加到info对象

反序列化时,在ISerializable构造函数中,我读取SerializationInfo以查找哪些成员已序列化,哪些未序列化。如果原始值未序列化,则将其值设置为当前值。(因此,由于未序列化而节省资源)

Protobuf-net中有什么方法可以让我找出哪些字段被反序列化了吗?我正在使用ShouldSerialize模式来不发送原始值,正如我前面所解释的,但是当我到达另一端时,我需要知道哪些字段被序列化以能够设置原始值

编辑:更多详细信息,这里是一个示例类

[Serializable()]
[ProtoContract(ImplicitFields = ImplicitFields.AllFields)]
public class SomeClass : ISerializable
{
    internal int? _key;
    internal int? _originalKey;

    internal bool ShouldSerialize_key()
    {
        return _key.HasValue;
    }
    [NonSerialized]
    public bool _keySpecified;

    internal bool ShouldSerialize_originalKey()
    {
        return _key != _originalKey;
    }
    [NonSerialized]
    public bool _originalKeySpecified;
    [OnDeserialized()]
    internal void OnDeserializedMethod(StreamingContext context)
    {
        // Use this to set the _originalKey if it hasn't been specified.
        if (!_originalKeySpecified)
        {
            _originalKey = _key;
        }
    }
}

如您所见,_originalKey如果与_键具有相同的值,则不会序列化。当对象被反序列化时,我想知道originalKey是否被反序列化。我原以为您对指定的_originalkey的回答会有效,但在上面的类中,一旦我反序列化,指定的_originalkey总是错误的。Protobuf反序列化过程是否设置了该值?(请注意,我不能使用ShouldSerialize属性来决定在反序列化时是否设置_originalKey,因为它可能已从null更改为另一个值,我需要在保存到数据存储时知道该值。

这取决于您的具体情况。例如,如果您有可为null的支持字段,则:序列化的字段ed是具有非空值的示例…即

private int? id;
[ProtoMember(n)]
public int Id {
    get { return id.GetValueOrDefault(); }
    set { id = value; }
}
public bool ShouldSerializeId() { return id.HasValue; }
在这里,您可以简单地检查每个
ShouldSerialize*
方法,以查看哪些值被反序列化;任何没有被反序列化的值都将仍然具有
null
(如果没有要反序列化的数据,它不会调用
集)

另一种选择是
*指定的
模式,由其他一些序列化程序(
XmlSerializer
、IIRC-以及可能的
DataContractSerializer
)使用。这是一个简单的bool属性,由序列化程序设置如果指定了值,则为
true
。同样,指定的
*值与
ShouldSerialize*
相同,以确定是否应在序列化过程中处理成员


如果我没有理解你的意图,请澄清(最好是举个例子),我会尝试解释更多。

我在上面添加了更多细节。重新编辑:请参阅我回答中的措辞:“这是一个简单的布尔属性…”-
\u originalKeySpecified
不是bool属性,因此与它要查找的模式不匹配。
\u keySpecified
也不是属性,请注意。另外,请注意,它不同时使用这两种模式:它查找
*指定的
属性,然后查找
shouldlserialize*
方法,然后停止。因此基本上您可以还会将一些其他逻辑移到指定的
*中。此顺序是因为指定的
*允许
获取
设置
(分别)
ShouldSerialize*
实际上只是一个
get
,第二个选择也是如此。啊,facepalm。它也必须是公共的,正如你下面所说的。为什么它不能设置为内部的呢?嗯……它应该是内部的/私有的;
ShouldSerialize*
可以(我刚刚测试过它)-我将看看为什么它不能在以后找到并修复;致力于源代码,但我还没有部署NuGet等