2013-07-09 2 views
1

Я надеюсь найти решение у вас. Мне нужно, чтобы сериализовать объект класса ValidatorList в XML-документе. Как это сделать?как сериализовать объекты класса в документ xml

Я пытался так:

XmlSerializer _serializer = new XmlSerializer(list); 

Но я не знаю, как сделать вывод XML для списка, который имеет несколько классов.

C#

_list= new ListVal(); 
Type _type = typeof(ras); 

_list.Add(new RequiredField 
        { 
         Property = _type.GetProperty("CustRef") 
        }.Add(new AsciiVal())); 
_list.Add(new RequiredField 
        { 
        Property = _type.GetProperty("ctr") 
        }.Add(new StringLengthVal 
          { 
          min= 3, 
          max= 3 
          })); 

[Serializable] 
public class Field 
{ 
public Field Next 
{ 
    get; 
    set; 
} 

public Field TypeName 
{ 
    get; 
    set; 
} 

    public Field PropertyName 
    { 
    get; 
    set; 
} 
} 

public class RequiredField : Field 
{ 
//TODO 
} 

public class AsciiVal: Field 
{ 
//TODO 
    } 

public class StringLengthVal: Field 
{ 
//TODO 
} 

public class ListVal: List<Field> 
{ 
//TODO 
    } 
+0

FYI процесс превращения объекта в поток данных (например, Xml) - это * сериализация *. * десериализация * идет в другую сторону. Ive обновил ваш вопрос с правильными фразами, чтобы сделать его более ясным – Jamiec

ответ

1

У меня есть кое-что близко, но не совсем Xml вы хотите. На самом деле, я думаю, вы увидите, что Xml, созданный ниже, имеет немного больше смысла, чем то, что у вас есть.

Чтобы начать работу, вы контролируете сериализацию и десериализацию с использованием атрибутов в System.Xml.Serialization namespace. Несколько полезных из них, чтобы прочитать на это

Так что я высмеивал некоторый код, который точно соответствует своему усмотрению. Обратите внимание на добавление некоторых атрибутов, чтобы проинструктировать сериализатор, как я хочу, чтобы Xml был выложен.

[XmlInclude(typeof(AsciiValidator))] 
[XmlInclude(typeof(RequiredValidator))] 
[XmlInclude(typeof(StringLengthValidator))] 
public class FieldValidator 
{ 
    [XmlElement("Next")] 
    public FieldValidator Next 
    { 
    get; 
    set; 
    } 

    [XmlElement("PropertyName")] 
    public string PropertyName 
    { 
    get; 
    set; 
    } 
} 

public class AsciiValidator: FieldValidator 
{ 
} 

public class RequiredValidator: FieldValidator 
{ 
} 

public class StringLengthValidator: FieldValidator 
{ 
    [XmlElement] 
    public int MinLength{get;set;} 
    [XmlElement] 
    public int MaxLength{get;set;} 
} 

[XmlRoot("ValidatorList")] 
public class ValidatorList : List<FieldValidator> 
{  
} 

Достопримечательность; Каждый класс наследующий FieldValidator должен быть добавлен в список известных типов, используя XmlIncludeAttribute так сериализатору знает, что делать с ними)

Затем я создал карту пример объекта:

var test = new ValidatorList(); 
test.Add(
      new RequiredValidator() 
       { 
        PropertyName="CustRef", 
        Next = new AsciiValidator() 
       });    
test.Add(
      new RequiredValidator() 
       { 
        PropertyName="CurrencyIndicator", 
         Next = new StringLengthValidator(){ 
          MinLength=3, 
          MaxLength = 10 
         } 
       }); 

Наконец я сказал сериализатор в сериализовать (и вывода результата на консоль)

var ser = new XmlSerializer(typeof(ValidatorList)); 
ser.Serialize(Console.Out,test); 

Это результат:

<?xml version="1.0" encoding="utf-8"?> 
<ValidatorList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <FieldValidator xsi:type="RequiredValidator"> 
    <Next xsi:type="AsciiValidator" /> 
    <PropertyName>CustRef</PropertyName> 
    </FieldValidator> 
    <FieldValidator xsi:type="RequiredValidator"> 
    <Next xsi:type="StringLengthValidator"> 
     <MinLength>3</MinLength> 
     <MaxLength>10</MaxLength> 
    </Next> 
    <PropertyName>CurrencyIndicator</PropertyName> 
    </FieldValidator> 
</ValidatorList> 

Не за миллион миль от того, что вы хотели. Существует необходимость в выводе определенных вещей определенным образом (например, xsi:type сообщает сериализатору, как десериализоваться обратно на карту объекта). Надеюсь, это даст вам хорошее начало.

Вот живой, рабочий пример: http://rextester.com/OXPOB95358

Десериализация может быть сделано путем вызова метода Deserialize на XmlSerializer.

Например, если ваш XML в строке:

var ser = new XmlSerializer(typeof(ValidatorList)); 
var test = "<..../>" // Your Xml 
var xmlReader = XmlReader.Create(new StringReader(test)); 
var validatorList = (ValidatorList)ser.Deserialize(xmlReader); 

Есть много переопределения десериализации, которые принимают различные входы в зависимости, если данные в потоке существующего читатель, или сохранить в файл.

+0

спасибо и как его обработать? – user235973457

+0

Вызов одного из методов 'Deserialize' на [' XmlSerializer'] (http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx) – Jamiec

+0

Я пробовал - он не работает. я бы хотел, чтобы вы поняли, что такое, чтобы я мог понять. спасибо большое за ур время :) – user235973457

0

Вы должны украсить класс, содержащий поле _validators с KonwnType атрибут

[Serializable] 
[KwownType(typeof(RequiredFieldValidator)] 
[KwownType(typeof(AsciValidator)] 
public class MySerialisableClass 
0

У меня есть несколько ответов SO, в которых подробно описывается сериализация объектов с использованием XML. Я приведу ссылки ниже.

Однако, поскольку вы ищете довольно простую сериализацию своего объекта, вы можете прочитать на DataContractSerializer. Это намного сложнее, чем старая XML-сериализация .NET 1.x.

Вот список SO ответов:

Хотя многие из них имеют отношение к XML сериализации и пространств имен, они содержат полные примеры сериализации n для XML с использованием .NET 1.x XML Serialization.

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