在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>
-

在c#中是否可以将属性属性序列化为XML属性?

我认为您必须为此编写自己的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属性的基类继承这些类,那么您不必担心!