Проблема XML-сериализации - PullRequest
       3

Проблема XML-сериализации

0 голосов
/ 16 декабря 2011

У меня есть следующие классы

[Serializable]
[XmlRoot("fileset")]
public class FileSet
{
    [XmlArray("")]
    [XmlArrayItem(ElementName="file")]
    public List<File> Files { get; set; }

    [XmlAttribute("complete")]
    public string Complete { get; set; }

    [XmlAttribute("id")]
    public string ID { get; set; }

    [XmlAttribute("search_expression")]
    public string Search_Expression { get; set; }

    [XmlAttribute("format_expression")]
    public string Format_Expression { get; set; }

    public FileSet()
    { }

}

[Serializable]
[XmlRoot("file")]    
public class File
{
    [XmlElement("action")]
    public List<Action> Actions { get; set; }

    [XmlAttribute("type")]
    public string Type { get; set; }

    [XmlAttribute("format")]
    public string Format { get; set; }

    [XmlAttribute("filefound")]
    public string FileFound { get; set; }

    [XmlAttribute("filename")]
    public string FileName { get; set; }

    [XmlAttribute("size")]
    public long Size { get; set; }

    [XmlAttribute("creationTime")]
    public DateTime CreationTime { get; set; }

    public File() { }

}

[Serializable]
[XmlRoot("action")]
public class Action
{
    [XmlAttribute("task")]
    public string Task { get; set; }

    [XmlAttribute("sequenceid")]
    public int SequenceId { get; set; }

    [XmlAttribute("source")]
    public string Source { get; set; }

    [XmlAttribute("destination")]
    public string Destination { get; set; }

    [XmlAttribute("desc")]
    public string Description { get; set; }

    public Action()
    { }

}

Предоставляемый мной xml-файл имеет следующий тип

<fileset complete="y" id="NY1109162" search_expression="" format_expression="">
  <file type="Datafile" format="NYyymmddn.zip" filefound="y" filename="NY1109162.zip" size="91703" creationTime="">
    <actions>
      <action task="move" sequenceid="1" source="" destination="" desc="move to archive"></action>
      <action task="copy" sequenceid="2" source="" destination="" desc="copy to production"></action>
      <action task="unzip" sequenceid="3" source="" destination="" desc="unzip files to working directory"></action>
    </actions>
  </file>
  <file type="Repfile" format="NYyymmddn.rep" filefound="y" filename="NY1109162.rep" size="17" creationTime="">
    <actions>
      <action task="copy" sequenceid="1" source="" destination="" desc="copy to archive"></action>
      <action task="copy" sequenceid="2" source="" destination="" desc="copy to production"></action>
    </actions>
  </file>
  <file type="Imagefile" format="NYyymmddn_images.zip" filefound="y" filename="NY1109162_images.zip" size="116550" creationTime="">
    <actions>
      <action task="move" sequenceid="1" source="" destination="" desc="move to archive"></action>
      <action task="copy" sequenceid="2" source="" destination="" desc="copy to production"></action>
      <action task="unzip" sequenceid="3" source="" destination="" desc="unzip files to working directory"></action>
    </actions>
  </file>
</fileset>

Но когда я сериализую свой объект FileSet обратно в xml, ондобавляет дополнительный тег, который я не хочу.Вывод сериализации:

<fileset complete="y" id="NY1109162" search_expression="" format_expression="">
<Files>
  <file type="Datafile" format="NYyymmddn.zip" filefound="y" filename="NY1109162.zip" size="91703" creationTime="">
    <actions>
      <action task="move" sequenceid="1" source="" destination="" desc="move to archive"></action>
      <action task="copy" sequenceid="2" source="" destination="" desc="copy to production"></action>
      <action task="unzip" sequenceid="3" source="" destination="" desc="unzip files to working directory"></action>
    </actions>
  </file>
  <file type="Repfile" format="NYyymmddn.rep" filefound="y" filename="NY1109162.rep" size="17" creationTime="">
    <actions>
      <action task="copy" sequenceid="1" source="" destination="" desc="copy to archive"></action>
      <action task="copy" sequenceid="2" source="" destination="" desc="copy to production"></action>
    </actions>
  </file>
  <file type="Imagefile" format="NYyymmddn_images.zip" filefound="y" filename="NY1109162_images.zip" size="116550" creationTime="">
    <actions>
      <action task="move" sequenceid="1" source="" destination="" desc="move to archive"></action>
      <action task="copy" sequenceid="2" source="" destination="" desc="copy to production"></action>
      <action task="unzip" sequenceid="3" source="" destination="" desc="unzip files to working directory"></action>
    </actions>
  </file>
</Files>
</fileset>

Может кто-нибудь помочь, пожалуйста ??

Ответы [ 2 ]

0 голосов
/ 16 декабря 2011

XmlSerializer не так уж и расширяемо. Если вы собираетесь использовать его, вы должны принять некоторые компромиссы в вашем формате данных. Вот несколько возможных способов избавиться от этого промежуточного элемента для массива:

  • Измените свой класс FileSet на прямое переопределение List<File> вместо того, чтобы иметь отдельное свойство списка. Это избавляет от внешнего элемента, но вы теряете возможность указывать имя элементов элемента массива.
  • Реализация IXmlSerializable в вашем FileSet классе. Это сложно, так как вы заставляете вас вручную писать свой собственный код сериализации и десериализации (чего обычно вам следует избегать при использовании XmlSerializer).
  • Прекратите использовать XmlSerializer и переключитесь на более гибкий сериализатор, такой как DataContractSerializer. Это не так просто, как XmlSerializer, но дает вам больше свободы для указания точного формата.
0 голосов
/ 16 декабря 2011

Я сомневаюсь, что вы можете изменить это - это похоже на предполагаемое поведение из-за следующего - Deserializer должен знать, куда он должен поместить вашу запись обратно.Так что добавьте дополнительный тег вокруг ваших записей.Представьте, что у вас будет 2 списка типизированных свойств

[XmlArray("")]
[XmlArrayItem(ElementName="file")]
public List<File> Files { get; set; }

[XmlArray("")]
[XmlArrayItem(ElementName="file")]
public List<File> ProcessedFiles { get; set; }

Если вам будет разрешено сериализовать все записи файла для потомков того же уровня - вы не сможете десериализовать его обратно - потому что вы не можетеукажите - куда следует помещать каждый .

Вы можете использовать сериализацию xml вручную, если указанный XML строго необходим и не может быть изменен.

...