【问题标题】:Is there a way to do object (with its attributes) serializing to xml?有没有办法将对象(及其属性)序列化为 xml?
【发布时间】:2008-12-24 05:11:55
【问题描述】:

创建一个类(称之为FormElement)。该类应该具有一些属性,例如它们具有数据元素的元数据(名称、序列号、值——它只是一个字符串等)。

此类具有类型验证应用程序块验证类的属性。

我想将它序列化为 xml 并反序列化它。验证类的所有属性(包括验证应用程序块属性)在序列化过程中是否存在。

有什么建议吗?

【问题讨论】:

  • 你用什么语言工作?

标签: c# .net xml-serialization


【解决方案1】:

.NET 框架内置了这个,使用 C# 你可以这样做:

// This code serializes a class instance to an XML file:
XmlSerializer xs = new XmlSerializer(typeof(objectToSerialize));

using (TextWriter writer = new StreamWriter(xmlFileName))
{
     xs.Serialize(writer, InstanceOfObjectToSerialize);
} 

这个 sn-p 是一个如何将 XML 文件反序列化回类实例的示例:

// this code creates a class instance from the file we just made:
objectToSerialize newObject;
XmlSerializer xs = new XmlSerializer(typeof(objectToSerialize));

using (TextReader reader = new StreamReader(xmlFileName))
{
    newObject = (ObjectToSerialize) xs.Deserialize(reader);
}

您必须使用 [Serializable] 属性标记您的类,这些属性才能工作。如果你想让你的 XML 输出更漂亮一点,你可以在你的类属性上使用 [XmlElement] 和 [XmlAttribute] 属性,让它们序列化到你选择的架构中。

【讨论】:

  • 我会将 typeof(objectToSerialize) 更改为 typeof(ClassToSerialize) 或 objectToSerialize.GetType()。就目前而言,对于那些刚接触 .NET 的人来说会有点混乱
【解决方案2】:

你说的序列化,是指使用官方的序列化机制,还是达到类似的效果?

如果您的对象是 bean,您可以使用反射来编写一个通用服务,该服务接受一个类并记下其类名和属性。它可以类似地从 XML 中读取材料并生成对象(Apache Digester 本质上就是这样做的)。

【讨论】:

    【解决方案3】:

    乔纳森·霍兰德所说的。

    但是,您还询问了验证。如果您使用 Jonathan 发布的代码,您的所有属性正确序列化和反序列化。但是,如果您真的想检查它,您可以使用您的 XmlSerializer 对象设置一个属性,以便验证 *.xsd 架构。您可以使用 Visual Studio 中包含的xsd.exe 命令行工具从您的类中轻松地创建架构。

    另外,听起来您可能想要控制类的某些属性是否被序列化为属性或元素。 Jonathon 谈到了这一点,但我想举个例子:

    [Serializable]
    public class FormElement
    {
       [XmlAttribute]
       public string Name {get; set;};
    
       [XmlAttribute]
       public int Sequence {get; set;};
    
       [XmlAttribute]
       public string Value {get; set;};
    
       [XmlElement]
       public Validation OnValidate{get; set;}
    
       [NonSerialized]
       public string UnimportantProperty {get; set;};
    
    }
    

    最后,要序列化的每个属性的类型也必须是可序列化的,复杂的类型必须序列化为 XmlElements。否则你将无法做到。

    【讨论】:

    • 您的代码具有误导性。 [Serializable] 和 [NonSerialized] 属性与 Xml 序列化无关!!我认为您想要 UnimportantProperty 上的 [XmlIgnore],并且您不需要类上的任何内容(根本没有属性)。或者如果你想明确一点,[XmlType]。
    【解决方案4】:

    XStream 是一个非常好的 Java 库,可以做到这一点。

    【讨论】:

    • 他正在寻找 c# 解决方案。
    猜你喜欢
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多