我正在尝试用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更改为另一个值,在保存到数据存储区时我需要知道。
答案 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*
的使用方式相同,以确定是否应在序列化期间处理成员。
如果我错过了你的意图,请澄清(最好以一个例子),我会尝试解释更多。