2014-12-05 2 views
1

Мне нужно сериализовать данные в XML, но у меня возникают реальные проблемы с разработкой, как это сделать. (в Visual Studio)Создание класса, который является сериализуемым - сложные объекты

Мне нужно создать этот тип XML, видимый ниже структуры. Но Object TypeType содержит 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. 

Я не могу изменить Илисты в список - так есть ли другой способ сделать это?

Вот Thr 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? и вы также отметили FormType с помощью [Serializable]? –

+0

Какая IDE вы используете? –

+0

Visual Studio 2013 - Я добавил FormType.cs, который также содержит IList объектов FormTypeVersion. – user3437721

ответ

0

для достижения этой цели использовать сериализации типа вместо IEnumerable<FormType>, может быть List<FormType>?

[edit] Конечно, FormType должен также реализовать ISerializable.

+0

Пробовал это, и он не работал, возможно, потому что сам FormType содержит другие объекты с ILists? – user3437721

+0

только что увидел, что вы отредактировали и заявили, что вы не можете использовать список ... –

+0

FormType должен реализовать ISerializable –

0

Так за ресурсы, которые я имею от вас вопрос, я пришел с примером

Foo

[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

EDIT: вы могли бы так же:

[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

+0

Как насчет использования ToList для получения списка элементов, прежде чем вы вызываете сериализацию? –

+0

XmlSerializer не поддерживает большинство типов, определенных в пространстве имен System.Collections, поскольку я знаю, что IEnumerable является одним из них. –

Смежные вопросы