C# DataContractSerializer跳过OpenAccess版本的值

C# DataContractSerializer跳过OpenAccess版本的值,c#,datacontractserializer,openaccess,C#,Datacontractserializer,Openaccess,我使用的是OpenAccess断开连接的模型。当我尝试使用DataConractSerializer反序列化一个对象时,该对象的Version属性为0—但仅在xml中。如果我调试代码并观察值-它是1或2,3 如果我在serialization int temp=object.Version之前说,seriazier可以保存该值 我敢肯定,这是一个懒惰的问题。如何在没有显式调用的情况下强制读取/保存此值 代码片段:听起来好像[DataMember]是针对字段设置的,或者默认为字段,并且绕过了惰性行

我使用的是OpenAccess断开连接的模型。当我尝试使用DataConractSerializer反序列化一个对象时,该对象的Version属性为0—但仅在xml中。如果我调试代码并观察值-它是1或2,3

如果我在serialization int temp=object.Version之前说,seriazier可以保存该值

我敢肯定,这是一个懒惰的问题。如何在没有显式调用的情况下强制读取/保存此值

代码片段:

听起来好像[DataMember]是针对字段设置的,或者默认为字段,并且绕过了惰性行为。如果您控制类型,您可能会添加一个[OnSerialization]方法,在序列化开始之前查看此属性。。。这样,它应该有一个值,并且您不需要将代码放到其他地方

如果生成了该类型,请查看它是否为分部类。如果是这样,您可以添加另一个具有相同名称和名称空间的分部类,并将[OnSerialization]方法放在其中

示例取消注释最后一个块以使其工作:

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;
    }
}
*/
听起来[DataMember]是针对字段设置的,或者默认为字段,并且绕过了惰性行为。如果您控制类型,您可能会添加一个[OnSerialization]方法,在序列化开始之前查看此属性。。。这样,它应该有一个值,并且您不需要将代码放到其他地方

如果生成了该类型,请查看它是否为分部类。如果是这样,您可以添加另一个具有相同名称和名称空间的分部类,并将[OnSerialization]方法放在其中

示例取消注释最后一个块以使其工作:

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方法,该方法将加载所有延迟加载的字段,并且您将拥有序列化所需的所有数据。希望对您有所帮助。

您应该在对象上调用.Retrieve方法,该方法将加载所有延迟加载的字段,并且您将拥有序列化所需的所有数据。希望这会有所帮助。

这是一个很好的解决方法!我所有的DAL类都有一个基类可以解决这个问题。如果Telerik没有提到这个问题,我认为你的答案是一个很好的解决方案。如果它是一个基类,你可能希望在序列化受保护的虚拟类之前,让继承的类可以添加到聚会中……是的……但遗憾的是OpenAccess在基类中不容易工作,或者我只是缺少了一些东西,这是我作为OA用户的第一天。它忽略了子类的Persistent属性中的继承成员——但这可能是一个新的线程:很好的解决方法!我所有的DAL类都有一个基类可以解决这个问题。如果Telerik没有提到这个问题,我认为你的答案是一个很好的解决方案。如果它是一个基类,你可能希望在序列化受保护的虚拟类之前,让继承的类可以添加到聚会中……是的……但遗憾的是OpenAccess在基类中不容易工作,或者我只是缺少了一些东西,这是我作为OA用户的第一天。它忽略子类的持久属性中的继承成员-但这可能是一个新线程: