Сериализация объекта класса с неправильным XML

1

В silverlight у меня есть xml:

<A>
    < A1>
       <B>
        < B1>a1.1</B1>
        <B1>a1.2</B1>
        </B>
    < /A1>

    < A1>
          <B>
          <B1>a1.3< /B1>
          <B1>a1.4</B1>
          </B>
    </A1>
</A>

Мой класс похож на этот A.cs

namespace Check
{
  [XmlRoot(ElementName = "A")]
  public class A
  {

    [XmlElement("A1")]
       public List<A1> A1 { get; set; } 

  }
}

и A1.cs:

namespace Check
{
  [XmlRoot(ElementName = "A1")]
  public class A1
  {  
        [XmlArray("B")]
        [XmlArrayItem("B1", typeof(string))]
        public List<string> B { get; set; }

  }
}

Класс B.cs - это

namespace Check
{
  [XmlRoot(ElementName = "B")]
  public class B
  {

        [XmlArray("B")]
        [XmlArrayItem("B1", typeof(string))]
        public List<string> B1 { get; set; }

  }
}

И я пытаюсь сериализовать это, в Xml.cs:

namespace Check
{
    public static class Xml
    {
        public static string ToXml(this object objectToSerialize)
        {
             var memory = new MemoryStream();
             var serial = new XmlSerializer(objectToSerialize.GetType());
             serial.Serialize(memory, objectToSerialize);  
            var utf8 = new UTF8Encoding();
            return utf8.GetString(memory.GetBuffer(), 0, (int)memory.Length);  
        }
    }
}

Основной класс функций:

namespace Check
{
    public  class ControlClass
    {
        public  void Main()
        {
            var a = new A() ;
            var xml = a.ToXml();

         }
    }
}

Правильно ли мой подход к сериализации? Если нет, пожалуйста, поправьте меня?

Мой выход:

<?xml version="1.0" encoding="utf-8" ?> 
  <A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> 
Теги:
xmlserializer
serialization
xml-serialization

1 ответ

1
Лучший ответ

Да, это правильно... иш. Причина, по которой не показывает более потому, что ваш экземпляр имеет только одно свойство (A A1), и имеет null значение. Добавьте данные, и он появится:

var a = new A {
    A1 = new List<A1> {
        new A1 { B = new List<string> { "a1.1", "a1.2" } },
        new A1 { B = new List<string> { "a1.3", "a1.4" } }
    }
};

Даже пустой список помог бы. По этой причине вы можете использовать:

[XmlElement("A1")]
public List<A1> A1 { get { return a1; } }
private readonly List<A1> a1 = new List<Check.A1>();

а также:

[XmlArray("B")]
[XmlArrayItem("B1", typeof(string))]
public List<string> B { get { return b1; } }
private readonly List<string> b1 = new List<string>();

вместе с:

var a = new A {
    A1 = {
        new A1 { B = { "a1.1", "a1.2" } },
        new A1 { B = { "a1.3", "a1.4" } }
    }
};

Примечание. Чтобы удалить объявления псевдонима имен по умолчанию:

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
serial.Serialize(memory, objectToSerialize, ns);

Затем он имеет выход:

<?xml version="1.0"?>
<A>
  <A1>
    <B>
      <B1>a1.1</B1>
      <B1>a1.2</B1>
    </B>
  </A1>
  <A1>
    <B>
      <B1>a1.3</B1>
      <B1>a1.4</B1>
    </B>
  </A1>
</A>
  • 0
    Спасибо сработало
  • 0
    у меня есть один вопрос в вашем ответе Как вы будете поступать, если я вставлю <A> <A1> ... B's Stuff сначала A1 .... </ A1> <C> Check1 </ C> <A1> ... снова Вещи для второго А1 .... </ A1>. Как будет управляться инициализация объекта, если мы будем отображать их в формате XML в том же порядке. Я имею в виду сначала А1, затем С, затем А1 (последний).
Показать ещё 6 комментариев

Ещё вопросы

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