我正在使用 OpenAccess 断开连接模型。当我尝试使用 DataConractSerializer 反序列化对象时,该对象的 Version 属性为 0 - 但仅在 xml 中。如果我调试代码并观察值 - 它是 1(或 2,3 ...)
如果我在序列化“int temp = object.Version”之前说,seriazlier 可以保存该值。
有一个懒惰的问题,我敢肯定。如何在没有显式调用的情况下强制读取/保存此值?
我正在使用 OpenAccess 断开连接模型。当我尝试使用 DataConractSerializer 反序列化对象时,该对象的 Version 属性为 0 - 但仅在 xml 中。如果我调试代码并观察值 - 它是 1(或 2,3 ...)
如果我在序列化“int temp = object.Version”之前说,seriazlier 可以保存该值。
有一个懒惰的问题,我敢肯定。如何在没有显式调用的情况下强制读取/保存此值?
听起来好像[DataMember]
是针对字段设置的(或默认为字段),并且绕过了惰性行为。如果您控制类型,您也许可以添加一个[OnSerializing]
在序列化开始之前查看此属性的方法......这样它应该有一个值,并且您不需要将代码放入其他地方。
如果生成了类型,请查看它是否为partial class
. 如果是这样,您可以添加另一个partial class
同名(和相同的命名空间),并将您的[OnSerializing]
方法放在那里......
示例(取消注释最后一个块以使其工作):
using System;
using System.Runtime.Serialization;
using System.Xml;
class Program {
static void Main() {
using (XmlWriter writer = XmlWriter.Create(Console.Out)) {
new DataContractSerializer(typeof(Foo))
.WriteObject(writer, new Foo());
}
}
}
[DataContract]
partial class Foo {
[DataMember(Name="Bar")]
private int? bar;
public int Bar {
get {
if (bar == null) bar = 27; // somthing lazy
return bar.GetValueOrDefault();
}
set { bar = value; }
}
}
/* UNCOMMENT THIS
partial class Foo {
[OnSerializing]
private void BeforeSerialize(StreamingContext ctx) {
int tmp = Bar;
}
}
*/
您应该在对象上调用 .Retrieve() 方法,该方法将加载所有延迟加载的字段,并且您将拥有序列化所需的所有数据。希望有帮助。