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

时间:2012-11-26 03:18:24

标签: protobuf-net

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

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

在Protobuf网中有没有办法找出哪些字段被反序列化了?我正在使用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与_key具有相同的值,则不会序列化它。当对象被反序列化时,我想知道_originalKey是否被反序列化。我认为你对_originalKeySpecified的回答是可行的,但是在上面的类中,一旦我反序列化,_originalKeySpecified总是假的。 Protobuf反序列化过程是否设定了值? (请注意,我不能使用ShouldSerialize属性来决定是否在反序列化时设置_originalKey,因为它可能已从null更改为另一个值,在保存到数据存储区时我需要知道。

1 个答案:

答案 0 :(得分:0)

这取决于你的具体情况。例如,如果你有可空的支持字段,那么:序列化的那些是具有非空值的例子......即。

private int? id;
[ProtoMember(n)]
public int Id {
    get { return id.GetValueOrDefault(); }
    set { id = value; }
}
public bool ShouldSerializeId() { return id.HasValue; }

在这里,您只需检查每个ShouldSerialize*方法,即可查看已反序列化的值;任何不是的内容仍会有null (如果它没有要反序列化的数据,则不会调用set。)

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

如果我错过了你的意图,请澄清(最好以一个例子),我会尝试解释更多。