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

时间:2011-09-13 02:26:07

标签: c# .net xml serialization

背景:这个问题是关于在C#.NET 4.0中记录POCO类的更改跟踪。

假设我有一个带有Name(string)属性的Person类。该Name属性有一个名为[IsDirty(true / false)]的自定义属性,由属性审计类动态设置。

[IsDirty(true)]
public string Name { get; set; }

在检测到更改并设置了属性后,我将通过常规XML序列化在MS SQL数据库(XML列类型)中存储对象。

我无法弄清楚的是,是否有可能以某种方式序列化我的自定义属性IsDirty及其当前值 - 最好是作为序列化XML元素(Name)上的XML属性,以便最终的xml如下: p>

<Name IsDirty="true">John</Name>

任何想法/信息都将不胜感激 -

2 个答案:

答案 0 :(得分:2)

我认为你必须为此编写自己的XML序列化,并混合使用一些反射来检查属性的属性值。

有一个很好的指南来实现IXMLSerializable接口here。遗憾的是,您必须实现类中所有属性的序列化,但从好的方面来说,如果正确实现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();       
    }
}

此代码未经测试并从内存中写入,因此可能存在一些潜伏的错误,但希望它能让您走上正确的轨道。

答案 1 :(得分:0)

可以通过手动读取属性及其值来实现。您可以通过在附加/读取xml和属性的方法中包装序列化和反序列化来实现此目的。

但是我会从具有属性IsDirty的基类继承这些类,那么你不用担心!