在c#中是否可以将属性属性序列化为XML属性?
本文关键字:属性 序列化 XML 是否 | 更新日期: 2023-09-27 18:08:29
背景:这个问题是关于记录c# . net 4.0中POCO类的更改跟踪的。
假设我有一个Person类,它有一个Name(字符串)属性。Name属性有一个自定义属性[IsDirty(true/false)],由属性审计类动态设置。
[IsDirty(true)]
public string Name { get; set; }
在检测到更改并设置属性之后,我将通过普通XML序列化将对象存储在MS SQL数据库(XML列类型)中。
我不能弄清楚的是,是否有可能以某种方式序列化我的自定义属性IsDirty以及它的当前值-最好作为序列化XML元素(Name)上的XML属性,以便最终XML如下:
<Name IsDirty="true">John</Name>
-
我认为您必须为此编写自己的XML序列化,并混合一些反射来检查属性上的属性值。
这里有一个很好的实现IXMLSerializable
接口的指南。不幸的是,您将不得不在类中实现所有属性的序列化,但好的一面是,如果您正确实现IXmlSerializable
,您仍然可以使用XmlSerializer
类。
在序列化代码中,可以使用如下方式检查属性值:
public class YourClass : IXmlSerializable
{
[IsDirty(true)]
public string Name { get; set; }
// skipped ReadXml and GetSchema interface methods for brevity
public void WriteXml(XmlWriter writer)
{
writer.WriteStartElement("YourClass");
var myType = typeof(YourClass);
foreach(var propInfo in myType.GetProperties())
{
writer.WriteStartElement(propInfo.Name);
foreach(var attr in propInfo.GetCustomAttributes(typeof(IsDirtyAttribute), false))
{
var myAttr = attr as IsDirtyAttribute;
writer.WriteAttributeString("Dirty", attr.Value ? "true" : "false");
}
writer.WriteEndElement();
}
writer.WriteEndElement();
}
}
这段代码是未经测试的,并且是从内存中编写的,所以可能会有一些bug潜伏在周围,但希望它能让您走上正确的轨道。
这可以通过手动读取属性及其值来实现。您可以通过将序列化和反序列化包装在方法中来实现这一点,这些方法在xml和属性中追加/读取…
但是,我将从具有IsDirty属性的基类继承这些类,那么您不必担心!