基于DB值的属性序列化和反序列化

时间:2012-06-04 16:51:50

标签: c# .net serialization xmlserializer

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

然后我序列化这个类并将其保存到数据库中的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;

        }
    }

2 个答案:

答案 0 :(得分: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; 
} 

答案 1 :(得分:0)

这里要注意的第一件事是[XmlIgnore]是多余的; XmlSerializer在get-only属性(列表除外)中只是不感兴趣,因为它知道它不能反序列化它们。例如:

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中(并且属性是读/写),否则永远不会随机调用“set”;当 时,它期望分配一个值

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

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

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