1

我有一个具有 bool 属性的简单类。此属性的“获取”逻辑执行存储过程以从数据库返回位字段。

然后我序列化这个类并将它保存到数据库中的一个 XML 字段中。它很好地保存了类和 bool 属性,没问题。

我似乎遇到的问题是当我反序列化这个类时。该类反序列化就好了,但是当驱动bool字段的数据已经更新时,该类似乎只识别XML中序列化的内容,并且它没有回溯数据库获取新的bool值(不执行我获取新更新位字段的过程)。

我的解决方案是将 XmlIgnoreAttribute 属性添加到该字段,因此它一开始就不会被序列化。但我想知道是否有人注意到这一点和/或可以帮助我理解 .NET XmlSerializer 类的内部工作。

谢谢!

[XmlIgnoreAttribute]
    public bool IsUpdated
    {
        get
        {
            DataTable dtResults = mclsSQLServerTool.LoadDataTable("exec stp_RL_SEL_NameIsUpdated '" + mstrName + "'");
            bool blnIsUpdated = Convert.ToBoolean(dtResults.Rows[0]["RU_bitIsUpdated"]);

            return blnIsUpdated;

        }
    }
4

2 回答 2

0

恕我直言,这是对属性的滥用。属性后面应该有很少或没有代码。如果此代码曾经在客户端-服务器应用程序中使用过,您可能会从客户端进行数据库调用。我建议将其更改为方法调用。如果要序列化结果,请将“Convert.ToBoolean”的结果存储在属性中。现在对于属性值是什么有点清楚了。

像这样的东西...

public bool IsUpdated { get; private set; }

public bool IsDataUpdated()
{ 
     DataTable dtResults = mclsSQLServerTool.LoadDataTable("exec stp_RL_SEL_NameIsUpdated '" + mstrName + "'"); 
     IsUpdated = Convert.ToBoolean(dtResults.Rows[0]["RU_bitIsUpdated"]); 

     return IsUpdated; 
} 
于 2012-06-04T17:16:42.293 回答
0

这里首先要注意的是这[XmlIgnore]是多余的;XmlSerializer对只获取属性(列表除外)根本不感兴趣,因为它知道它不能反序列化它们。例如:

public class SomeType
{
    public string Foo { get; set; }
    public string Bar { get { Console.WriteLine("get_Bar"); return "abc"; } }

    static void Main()
    {
        var ser = new XmlSerializer(typeof (SomeType));
        ser.Serialize(Console.Out, new SomeType { Foo = "def" });
    }
}

输出(减去命名空间别名等):

<SomeType>
  <Foo>def</Foo>
</SomeType>

(注意Bar没有被调用)

对于反序列化,过程(对于简单值,而不是列表)很简单:当在传入的 xml 流中找到值时,将它们解析为成员并分配它们 - 即 xml-deserializer 基本上是基于传入的美化 switch 语句xml 节点。

除非数据在传入的 xml 中(并且属性是读/写的),否则它永远不会随机调用“集合”;当它这样时,它期望分配一个值

您的场景中有趣的是您的“get”不会在任何地方分配值 - 没有缓存。所以实际上,不碰它并不重要——XmlSerializer每次你访问IsUpdated它时都会进行查询。就我个人而言,我怀疑这是一个错误,并可能导致激进和不可预测的数据查询。

许多序列化程序支持序列化回调的概念,这将允许您在序列化结束时执行一些代码;但是,XmlSerializer 支持这一点。所以这不是一个选择。

目前还不是很清楚你想要实现什么,但我只是在某个时候调用一个方法。

于 2012-06-04T18:33:48.883 回答