有没有办法将对象(及其属性)序列化为xml?
创建一个类(称之为FormElement)。 该类应该具有一些属性,例如它们与数据元素(名称,序列号,值 – 只是一个字符串等)的元数据。
此类具有Validation Application Block Validation类型的属性。
我想将它序列化为xml并反序列化它。 validation包括validation应用程序块属性的类的所有属性是否在序列化后继续存在。
一些建议?
.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]属性将它们序列化到您选择的模式中。
通过说序列化,你的意思是使用官方的序列化机制,还是达到类似的效果?
如果您的对象是bean,则可以使用reflection来编写接受类的常规服务并写下其类名和属性。 它可以类似地从XML中读取材料并生成对象(这是Apache Digester本质上所做的)。
Jonathon Holland说的话。
但是,您还询问了validation。 如果您使用Jonathan发布的代码,则所有属性都将正确序列化和反序列化。 但是,如果您确实想要检查它,则可以使用XmlSerializer对象设置一个属性,以便* .xsd架构进行validation。 通过使用Visual Studio附带的xsd.exe
命令行工具,您可以从类中轻松创建架构。
此外,听起来您可能想要控制类的某些属性是否被序列化为属性或元素。 乔纳森谈到了这一点,但我想展示一个例子:
[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库,可以做到这一点。