我有一个具有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;
}
}
答案 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
不支持 。所以这不是一个选择。
目前还不是很清楚你想要实现什么,但我只是在某个时候调用一个方法。