【问题标题】:Is it possible to serialize property attributes to XML attributes in C#?是否可以在 C# 中将属性属性序列化为 XML 属性?
【发布时间】:2011-09-13 02:26:06
【问题描述】:

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

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

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

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

我想不通的是,是否有可能以某种方式序列化我的自定义属性 IsDirty 及其当前值 - 最好作为序列化 XML 元素(名称)上的 XML 属性,以便最终的 xml 如下所示:

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

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

【问题讨论】:

  • 并且您还希望能够将其反序列化并将该属性也设置为适当的值?
  • 我不明白您为什么要使用属性来存储“脏”状态。我不认为你能做到这一点。你能解释一下它是如何工作的吗?
  • @Valentin - 是的,抱歉,不清楚。我希望能够将其反序列化回对象的原始状态。
  • @Scott - 好吧,它是一个实例变量,所以我在这里假设(你知道它在哪里)我可以使用 GetCustomAttributes() 来(最终)获得对单个属性的访问 - 一旦我'已经知道我可以设置我的属性值。 (我认为)
  • @kman0 我以为每次调用GetCustomAttributes 都会创建新的属性?在这种情况下,它对于存储状态不会很有用。

标签: c# .net xml serialization


【解决方案1】:

我认为您将不得不为此编写自己的 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();       
    }
}

此代码未经测试且是凭记忆编写的,因此可能存在一些错误,但希望它能让您走上正轨。

【讨论】:

  • 我同意,这可能是他想要做的最好的方法。
  • @Anna - 谢谢。自定义序列化已经在我脑海中浮现,但我真的不知道从哪里开始。希望我可以同时做到这两种方式,甚至反序列化它。
【解决方案2】:

可以通过手动读取您的属性及其值来实现。您可以通过将序列化和反序列化包装在附加/读取到/从 xml 和属性的方法中来做到这一点..

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

【讨论】:

  • 好吧,这取决于“无需担心”的定义,如果他们让 AOP 做了很多杂乱的工作并且实体仍然具有正常类型的字段(并非所有都继承自 PossiblyDirty 或者是 PossiblyDirty 实例) 修复序列化问题听起来是一种更好的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 2014-04-08
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多