如何序列化List ?
我有Aclass.Bclass和Cclass是Aclass的一部分。
Class A { //Few Properties of Class A List list1 = new List() List list2 = new List() Nsystem NotSystem { get; set; } // Enum Property Type } public enum Nsystem { A = 0, B = 1, C = 2 }
我想序列化A类,并希望用它生成XML; 我还想序列化list1和list2以及枚举…
序列化这个XML有什么好方法,因为我需要将Object转换为XML和XML转换为Object的function……
有什么好的选择呢? 谢谢
您可以使用XMLSerializer :
var aSerializer = new XmlSerializer(typeof(A)); StringBuilder sb = new StringBuilder(); StringWriter sw = new StringWriter(sb); aSerializer.Serialize(sw, new A()); // pass an instance of A string xmlResult = sw.GetStringBuilder().ToString();
为了使其正常工作,您还需要对类型进行xml注释,以确保使用正确的命名进行序列化,即:
public enum NSystem { A = 0, B = 1, C = 2 } [Serializable] [XmlRoot(ElementName = "A")] Class A { //Few Properties of Class A [XmlArrayItem("ListOfB")] List list1; [XmlArrayItem("ListOfC")] List list2; NSystem NotSystem { get; set; } }
编辑:
默认情况下, Enum
属性是序列化的,属性名称包含XML元素,枚举值为XML值,即如果示例中的属性NotSystem
具有值C
则序列化为
C
当然,您可以通过执行正确的注释来更改属性序列化的方式,即使用[XmlAttribute]
其序列化为属性,或者[XmlElement("Foobar")]
以便使用Foobar
作为元素名称进行序列化。 有关MSDN的更多文档,请查看上面的链接。
你可以用它
[XmlArray("array_name")] [XmlArrayItem("Item_in_array")] public List _List;
使用IO错误捕获对任何对象进行二进制序列化的简便方法。
List asdf = new List (); //Serialization Serializer.Save("data.bin", asdf); //Deserialization asdf = Serializer.Load>("data.bin");
Serializer类:
public static class Serializer { public static void Save(string filePath, object objToSerialize) { try { using (Stream stream = File.Open(filePath, FileMode.Create)) { BinaryFormatter bin = new BinaryFormatter(); bin.Serialize(stream, objToSerialize); } } catch (IOException) { } } public static T Load(string filePath) where T : new() { T rez = new T(); try { using (Stream stream = File.Open(filePath, FileMode.Open)) { BinaryFormatter bin = new BinaryFormatter(); rez = (T) bin.Deserialize(stream); } } catch (IOException) { } return rez; } }
您需要使用XML作为表示吗? 您可能还需要考虑二进制表示,这通常更快,更紧凑。 你有内置的BinaryFormatter ,甚至更好的是你可以使用快速且超紧凑的协议缓冲区 。 如果您需要XML,您可能需要考虑是否要支持某种与其他语言和技术甚至平台的互操作性。 如果它只是C#到c#,则Xml的XmlSerializer或BinaryFormatter都可以。 如果您要与Javascript交互,您可以考虑使用JSON(您可以尝试使用JSON.NET 。此外,如果您想支持Windows Phone或其他更受限制的设备,可能更容易使用可在任何地方使用的XmlSerializer。
最后,您可能更喜欢只有一个通用的基础架构,并支持许多序列化机制和传输。 微软在WCF中提供了一个很棒的(虽然有点慢)解决方案。 也许如果您对系统的要求有更多说明,那么建议实施会更容易。 好消息是你有很多选择。
正如cloudraven建议的那样,您可以使用二进制表示。 在寻找解决方案时,我发现了这个链接。 基本上,您将A类标记为[Serializable],对于您的B和C类也是如此。 然后你可以使用这些函数来序列化和反序列化
public IList
JAXB是我用过的最好的。
http://www.oracle.com/technetwork/articles/javase/index-140168.html
来自XML:
QuestionEntity obj = null; try { JAXBContext ctx = JAXBContext.newInstance(QuestionEntity.class); Unmarshaller unmarshaller = ctx.createUnmarshaller(); obj = (QuestionEntity) unmarshaller.unmarshal(new StreamSource(new StringReader(xml))); } catch (JAXBException e) { e.printStackTrace(); }
到XML:
JAXBContext ctx = JAXBContext.newInstance(TestEntity.class); Marshaller marshaller = ctx.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); StringWriter stringWriter = new StringWriter(); marshaller.marshal(this, stringWriter); return stringWriter.toString();