Не знаете, какому объекту следует назначить функцию - PullRequest
2 голосов
/ 19 марта 2010

у меня есть следующие два класса, которые преобразуют объект в строку XML

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

class Person
{

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

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

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

 }

Спасибо

Ответы [ 6 ]

3 голосов
/ 19 марта 2010

Задайте вопрос: что человек знает о XML?

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

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

2 голосов
/ 19 марта 2010

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

1 голос
/ 19 марта 2010

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

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

На самом деле в .NET существует механизм, называемый суррогатами сериализации, для разделения логики сериализации на отдельный класс. Подробнее см. часть 3 этой статьи .

0 голосов
/ 19 марта 2010

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

0 голосов
/ 19 марта 2010

Чтобы завершить, вы должны использовать интерфейс 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(). Я обновил код выше, чтобы проиллюстрировать его использование.

0 голосов
/ 19 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...