创建一个类(称为 FormElement)。该类应该具有一些属性,例如它们具有数据元素的元数据(名称、序列号、值——它只是一个字符串等)。
此类具有类型验证应用程序块验证类的属性。
我想将它序列化为 xml 并反序列化它。验证包括验证应用程序块属性在内的类的所有属性在序列化过程中是否存在。
一些建议?
创建一个类(称为 FormElement)。该类应该具有一些属性,例如它们具有数据元素的元数据(名称、序列号、值——它只是一个字符串等)。
此类具有类型验证应用程序块验证类的属性。
我想将它序列化为 xml 并反序列化它。验证包括验证应用程序块属性在内的类的所有属性在序列化过程中是否存在。
一些建议?
.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);
}
这个片段是如何将 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] 属性来让它们序列化到你选择的模式中。
说serialize,是指使用官方的Serialization机制,还是达到类似的效果?
如果您的对象是 bean,您可以使用反射来编写一个通用服务,该服务接受一个类并记下其类名和属性。它可以类似地从 XML 中读取材料并生成对象(这是 Apache Digester 本质上所做的)。
乔纳森·霍兰德所说的。
但是,您还询问了验证。如果您使用 Jonathan 发布的代码,您的所有属性都将正确序列化和反序列化。但是,如果您真的想检查它,您可以使用您的 XmlSerializer 对象设置一个属性,以便验证 *.xsd 架构。xsd.exe
您可以使用Visual Studio 附带的命令行工具从您的类中轻松地创建架构。
此外,听起来您可能想要控制类的某些属性是否被序列化为属性或元素。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。否则你将无法做到。
XStream是一个非常好的 Java 库,可以做到这一点。