2010-03-19 1 views
2

я следующие два класса, который преобразует объект в XML-строкуConfuse о какой объект я должен назначить функцию

я должен сделать что-то вроде

class Person 
{ 

    public string GetXml() 
    { 
     //return a xml string 
    } 
} 

или лучше создать другой класс, лицеприятный в качестве параметра и преобразовать его в XML-то вроде

class PersonSerializer 
{   
    public string Serialize(Person person) 
    { 
      // return a xml string 
    } 

} 

Благодарности

ответ

2

Как правило, метод Serialize должен быть в классе, который вы хотите сериализовать; Таким образом, он может получить доступ ко всем частным переменным-членам, к которым другие классы не могут получить доступ, и, как правило, более эффективно

0

2-й вариант. Вы можете создать универсальный сериализатор, который может сериализовать различные объекты/классы. Держите свои классы как простые, делайте то, что он должен делать. Сериализация - это не то, что должен делать человек.

3

Вопрос: что человек знает об XML?

Ответ: ничего

Итак, третий голос за отдельную сериализатором.

+0

да, я согласен, но я видел нечто подобное.net classes classes Пример: int int1 = 1; int1.ToString(); – CliffC

+0

Я не думаю, что создание отдельного класса было бы хорошей идеей. Он использует его только для сериализации объекта Person. Итак, я думаю, сам объект должен знать, как сериализовать себя. – ata

+0

ToString рассматривается как элемент низкого уровня, он исходит из system.object и также является строковым представлением по умолчанию в отладчике. Компромисс. @ comerback84 - хороший ответ. К сожалению ... все еще тематически неправильно. А как насчет разбора ?;) – TomTom

0

Чтобы иметь полный комплект, вы должны использовать интерфейс IXmlSerializable. То есть:

class Person : IXmlSerializable 
{ 
    #region IXmlSerializable Members 

    public System.Xml.Schema.XmlSchema GetSchema() 
    { 
     // Provide Schema 
     return null; 
    } 

    public void ReadXml(System.Xml.XmlReader reader) 
    { 
     // Read XML into Object 
    } 

    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     // Write XML here 
    } 

    #endregion 

    // Added as example to what I have said below 
    public override string ToString() 
    { 
     // Make XML String 
     return "XML STRING"; 
    } 
} 

В ответ на ваш комментарий к TomTom:

да я согласен, но я видел что-то похожее на сам .net классов Пример: INT int1 = 1; int1.ToString();

Что вы видели здесь, это переопределение метода ToString(). Я обновил приведенный выше код, чтобы проиллюстрировать его использование.

1

Для создания сериализаций объектов в формате XML существует механизм .NET. Обратитесь к this article за подробностями об атрибутах, которые вы можете использовать для декларативного обозначения аспектов вашего класса, который вы хотите сериализовать.

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

В .NET существует механизм, называемый суррогатами сериализации, для разделения логики сериализации на отдельный класс. См. part 3 of this article.

0

.NET XmlSerializer может сериализовать любой тип. Сериализованными элементами являются все свойства чтения/записи в импульсном режиме. Таким образом, PersonXmlSerializer уже существует ;-)

+0

сборка .Net XmlSerializer полезна, однако есть некоторые ограничения на нее, например он вернет ошибку, если есть какой-либо интерфейс для любого класса, который вы хотите сериализовать. – CliffC

+0

@CliffC: Действительно ...? Не могли бы вы дать мне пример? – Seb

+1

ссылка на вопрос http://geekswithblogs.net/SoftwareDoneRight/archive/2008/01/16/how-to-serialize-an-interface-using-the-xmlserializer.aspx – CliffC

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