2014-12-05 35 views
1

我需要将数据序列化为XML,但是我很难解决如何做到这一点。 (在Visual Studio中)创建一个可序列化的类 - 复杂的对象

我需要在下面的结构中创建这种类型的XML。但Object FormType包含IList,它不会序列化。

<?xml version="1.0" encoding="utf-16"?> 
<VersionXml xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<ImportId>1</ImportId> 
<Environment>SIT</Environment> 
<DateExported>12/2/2014</DateExported> 
<FormType> 
    <Id>4000</Id> 
    <FormTypeVersion> 
     <DisplayName>display name here</DisplayName> 
     <FormNumber>12345<FormNumber> 
     <Name>12345-abc<Name> 
     <CompanyId>1</CompanyId> 
     <Active>1<Active> 
     <RevisionHistoryNumber>2<RevisionHistoryNumber> 
    <FormTypeVersion> 
    <FormTypeVersion> 
     <DisplayName>display name here</DisplayName> 
     <FormNumber>12345<FormNumber> 
     <Name>12345-abc<Name> 
     <CompanyId>1</CompanyId> 
     <Active>1<Active> 
     <RevisionHistoryNumber>3<RevisionHistoryNumber> 
    <FormTypeVersion> 
</FormType> 
<FormType> 
    <Id>4001</Id> 
    <FormTypeVersion> 
     <DisplayName>another one here</DisplayName> 
     <FormNumber>456<FormNumber> 
     <Name>456-bcd<Name> 
     <CompanyId>1</CompanyId> 
     <Active>1<Active> 
     <RevisionHistoryNumber>3<RevisionHistoryNumber> 
    <FormTypeVersion> 
    <FormTypeVersion> 
     <DisplayName>another one here</DisplayName> 
     <FormNumber>456<FormNumber> 
     <Name>456-bcd<Name> 
     <CompanyId>1</CompanyId> 
     <Active>1<Active> 
     <RevisionHistoryNumber>1<RevisionHistoryNumber> 
    <FormTypeVersion> 
</FormType> 
</VersionXml> 

这里是我的课我试图创建,但FormType不会序列化,并得到反射错误

[Serializable] 
    public class FormXml 
    { 
     public string ImportID { get; set; } 
     public string Environment { get; set; } 
     public string DateExported { get; set; } 
     public IEnumerable<FormType> FormType { get; set; } 
    } 

这是收到的错误:

Cannot serialize member FormXml.FormType of type System.Collections.Generic.IEnumerable`1..... because it is an interface. 

我不能改变的IList到一个列表 - 那么还有另一种方法来做到这一点?

这里是苏氨酸FormType.cs

[Serializable] 
    public class FormType : Entity 
    { 
     public virtual ProductCode Product { get; set; } 

     public virtual String DisplayName { get; set; } 

     public virtual String FormNumber { get; set; } 

     public virtual String Name { get; set; } 

     public virtual Boolean Active { get; set; } 

     private IList<FormTypeVersion> _versions = new List<FormTypeVersion>(); 

     public virtual IList<FormTypeVersion> Versions 
     { 
      get { return _versions; } 
      set { _versions = value; } 
     } 
    } 
+0

“1 .....因为它是一个接口”你能告诉我FormType吗?你有没有用[Serializable]标记FormType呢? – 2014-12-05 10:05:33

+0

您正在使用哪种IDE? – 2014-12-05 10:06:23

+0

Visual Studio 2013 - 我添加了FormType.cs,它也包含FormTypeVersion对象的ILists – user3437721 2014-12-05 10:10:07

回答

0

实现这一使用序列化的类型,而不是IEnumerable<FormType>,也许List<FormType>

[编辑]当然,FormType也必须实现ISerializable。

+0

试过这个,它没有工作,也许是因为FormType本身包含IList的其他对象? – user3437721 2014-12-05 10:09:17

+0

只是看到你编辑并声明你不能使用列表 ... – 2014-12-05 10:09:17

+0

FormType应该实现ISerializable – 2014-12-05 10:10:10

0

所以对于我是从你有资源的问题,我用的例子来自

[Serializable] 
[XmlRoot("Foo")] 
public class Foo 
{ 
    [XmlArray("BarList"), XmlArrayItem(typeof(Bar), ElementName = "Bar")] 
    public List<Bar> BarList { get; set; } 
} 

酒吧

[Serializable] 
public class Bar 
{ 
    public string Property1 { get; set; } 
    public string Property2 { get; set; } 
} 

代码来测试

Foo f = new Foo(); 
f.BarList = new List<Bar>(); 
f.BarList.Add(new Bar() { Property1 = "s", Property2 = "2" }); 
f.BarList.Add(new Bar() { Property1 = "s", Property2 = "2" }); 

FileStream fs = new FileStream("c:\\test.xml", FileMode.OpenOrCreate); 
System.Xml.Serialization.XmlSerializer s = new System.Xml.Serialization.XmlSerializer(typeof(Foo)); 
s.Serialize(fs, f); 

输出

<?xml version="1.0" ?> 
<Foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <BarList> 
     <Bar> 
      <Property1>s</Property1> 
      <Property2>2</Property2> 
     </Bar> 
     <Bar> 
      <Property1>s</Property1> 
      <Property2>2</Property2> 
     </Bar> 
    </BarList> 
</Foo> 

这是展示如何使用序列化自定义类列表中的XML。

你也可以参考:

Serializing Lists of Classes to XML

XML Serialize generic list of serializable objects

XML Serialization and Deserialization

编辑: 你可以ASLO:

[Serializable] 
[XmlRoot] 
public class FormXml 
{ 
    public string ImportID { get; set; } 
    public string Environment { get; set; } 
    public string DateExported { get; set; } 
    [XmlIgnore] 
    public IEnumerable<FormType> FormType { get; set; } 
    [XmlElement, Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
    public List<FormType> Foo { get { return FormType.ToList() } set { FormType = value; } } 
} 
+0

但是这使用列表而不是IList? – user3437721 2014-12-05 10:13:01

+0

如何在调用序列化之前使用ToList获取项目列表? – 2014-12-05 10:16:27

+0

XmlSerializer不支持在System.Collections命名空间中定义的大多数类型,因为我知道IEnumerable就是其中之一 – 2014-12-05 10:17:40