【发布时间】:2012-11-26 03:18:23
【问题描述】:
我正在尝试用 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 与_key 具有相同的值,则它不会被序列化。当对象被反序列化时,我想知道 _originalKey 是否被反序列化。我认为您对 _originalKeySpecified 的回答会起作用,但在上面的课程中,一旦我反序列化,_originalKeySpecified 总是错误的。 Protobuf 反序列化过程是否设置了值? (请注意,我无法使用 ShouldSerialize 属性来决定是否在反序列化时设置 _originalKey,因为它可能已从 null 更改为另一个值,我需要在保存到数据存储区时知道这一点。
【问题讨论】:
-
重新编辑:请参阅我的回答中的措辞:“这是一个简单的 bool 属性...” -
_originalKeySpecified不是 bool 属性,所以不是匹配它正在寻找的模式。_keySpecified也不是属性,请注意。 -
另外,请注意它不使用 both 模式:它查找
*Specified属性,然后查找ShouldSerialize*方法,然后停止。所以基本上你也会把你的一些其他逻辑移到*Specified。这个顺序是因为*Specified允许get和set(分别);ShouldSerialize*实际上只是get,所以是第二选择。 -
啊facepalm。正如您在下面所说,它还必须是公开的。为什么它不能设置为内部工作?
-
hmmm...它应该作为内部/私有工作;
ShouldSerialize*确实如此(我刚刚测试过) - 我会看看为什么稍后不起作用 -
找到并修复;致力于源,但我还没有部署 NuGet 等
标签: protobuf-net