Создание класса, который сериализуем - сложные объекты

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.

Я не могу изменить 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? а вы пометили FormType [Serializable] тоже?
  • 0
    Какой IDE вы используете?
Показать ещё 3 комментария
Теги:
serialization

2 ответа

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 с пользовательскими списками классов.

Вы также можете обратиться к:

Сериализация списков классов для XML

XML Сериализовать общий список сериализуемых объектов

Сериализация XML и десериализация

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?
  • 0
    Как насчет использования ToList для получения списка элементов перед вызовом serialize?
Показать ещё 4 комментария
0

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

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

  • 0
    Пробовал это, и это не сработало, возможно, потому что сам FormType содержит другие объекты с ILists?
  • 0
    только что увидел, что вы отредактировали и заявил, что вы не можете использовать список <T> ...
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню