创建一个可序列化的类 - 复杂对象
本文关键字:复杂 对象 序列化 一个 创建 | 更新日期: 2023-09-27 18:33:10
我需要将数据序列化为 XML,但我在弄清楚如何做到这一点时遇到了真正的麻烦。(在Visual Studio中)
我需要创建这种类型的 XML,如下所示的结构。 但是对象窗体类型包含 ILists,它不会序列化。
<?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 更改为列表 - 那么有没有另一种方法可以做到这一点?
这是表单类型.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; }
}
}
来实现这一点,请使用可序列化的类型而不是IEnumerable<FormType>
,也许是List<FormType>
?
[编辑] 当然,FormType 也必须实现 ISerializable。
因此,对于我从您那里获得的资源,我提供了示例
傅
[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。
您也可以参考:
将类列表序列化为 XML
XML 序列化可序列化对象的泛型列表
XML 序列化和反序列化
编辑:您也可以:
[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; } }
}