XmlSerialization коллекций - PullRequest
       12

XmlSerialization коллекций

3 голосов
/ 29 ноября 2008

Я хочу сериализовать следующую структуру XML:

  <XmlRootElement>
     <Company name="Acme Widgets LLC">
        <DbApplication name="ApplicationA" vendor="oracle">
           <ConnSpec environment="DEV" 
                     server="DBOraDev1201" 
                     database="AppA" 
                     userId="MyUser" 
                     password="5613456#6%^%$%$#" />
           <ConnSpec environment="QA" 
                     server="DBOraQA1205" 
                     database="AppA" 
                     userId="MyUser" 
                     password="5613456#6%^%$%$#" />
       </DbApplication>
       <DbApplication name="AnotherApp" "vendor="SQLServer">
           <ConnSpec environment="DEV" 
                     server="DBMsSqlDev1201" 
                     catalog="AnoptherApp" 
                     userId="MyUser" 
                     password="5613456#6%^%$%$#" />
           <ConnSpec environment="QA" 
                     server="DBMsSqlQA1565" 
                     catalog="AnotherApp" 
                     userId="MyUser" 
                     password="5613456#6%^%$%$#" />
       </DbApplication>
     </Company>
     <Company name = "ExpertSoftware Inc" ....
        ...
     </Company>
  </XmlRootElement>

но я обнаружил в текст ссылки

Цитата сверху ссылка: ...

  • В: Почему не все свойства коллекции классов сериализованы?
  • A: XmlSerializer только сериализует элементы в коллекции, когда он обнаруживает либо IEnumerable, либо интерфейс ICollection. это Поведение - это дизайн. Единственная работа вокруг, чтобы перестроить обычай сбор на два класса, один из который выставляет свойства в том числе один из чистой коллекции типы.

...

после обнаружения, что вы не можете сериализовать или десериализовать коллекцию, в которой есть другие атрибуты Xml ... Предлагаемый обходной путь - отделить элемент, имеющий коллекцию, от элементов, имеющих другие атрибуты ... Вы должны изменить структуру так, чтобы она выглядела следующим образом:

  <XmlRootElement>
     <Companys>
        <Company name="Acme Widgets LLC">
           <DbApplications>
               <DbApplication name="ApplicationA" vendor="oracle">
                  <ConnSpecs>
                     <ConnSpec environment="DEV" 
                         server="DBOraDev1201" ...  />
                     <ConnSpec environment="QA" 
                         server="DBOraQA1205" 
                         database="AppA" ... />
                  </ConnSpecs>
               </DbApplication>
               <DbApplication name="AnotherApp" "vendor="SQLServer">
                  <ConnSpecs>
                      <ConnSpec environment="DEV" ... />
                      <ConnSpec environment="QA"  ... />
                  </ConnSpecs>
                </DbApplication>
           </DbApplications>
         </Company>
         <Company name = "ExpertSoftware Inc" ....
             ...
         </Company>
     </Companys>
  </XmlRootElement>

Кто-нибудь знает, почему это так? или есть ли другой способ сделать это?

Ответы [ 2 ]

2 голосов
/ 30 ноября 2008

Если вы используете XmlSerializer , вам нужно указать, как сериализовать ваши коллекции:

public class XmlRootElement
{
    [XmlElement(ElementName="Company")]
    public Company[] Company { get; set; }

    // Other properties ....
}

public class Company
{
    [XmlAttribute(AttributeName="name")]
    public string Name { get; set; }

    [XmlElement(ElementName = "DbApplication")]
    public DbApplication[] DbApplication { get; set; }

    // Other properties ....
}

public class DbApplication
{
    [XmlElement(ElementName = "ConnSpec")]
    public ConnSpec[] ConnSpec { get; set; }

    // Other properties ....
}

public class ConnSpec
{
    // Other properties ....
}

А потом:

using (Stream stream = new FileStream("test.xml", FileMode.Open, FileAccess.Read, FileShare.Read))
{
    XmlSerializer serializer = new XmlSerializer(typeof(XmlRootElement));
    XmlRootElement root = (XmlRootElement)serializer.Deserialize(stream);
}

Надеюсь, это поможет.

1 голос
/ 01 декабря 2008

Альтернативой добавлению атрибутов сериализации XMl во все ваши классы является реализация интерфейса IXmlSerializable в классе контейнера корневого элемента. Методы ReadXml и WriteXml этого интерфейса будут использоваться XmlSerializer, что позволит вам иметь более точный контроль над процессом сериализации / десериализации.

...