混淆我应该将功能分配给哪个对象

时间:2010-03-19 11:04:13

标签: c# oop

我有以下两个将对象转换为xml字符串

的类

我应该做点什么

class Person
{

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

或者最好创建另一个接受person作为参数的类 并将其转换为XML,如

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

 }

由于

6 个答案:

答案 0 :(得分:3)

要问的问题:一个人对XML的了解是什么?

答案:没什么

所以,第三次投票给一个单独的序列化器。

答案 1 :(得分:2)

通常,Serialize方法应该在要序列化的类上;这样,它可以访问其他类无法访问的所有私有成员变量,并且通常可以更有效地执行操作

答案 2 :(得分:1)

.NET中已经存在一种用于对象的XML序列化的机制,请查看this article以获取有关可用于声明性地标记要序列化的类的各个方面的属性的详细信息。

您的原始问题实际上是询问是否将序列化信息嵌入到其所属的类中,或者将其放入单独的,但相关联的类中。第一种方法的优点是序列化代码能够直接访问私有成员并与类紧密耦合。缺点是序列化代码覆盖了类的实际逻辑 - 如果你也添加了二进制序列化,这就变得更加明显了。

在.NET中实际上存在一种称为序列化代理的机制,用于将序列化逻辑分离到单独的类。有关详细信息,请参阅part 3 of this article

答案 3 :(得分:0)

第二个选项。您可以创建可以序列化不同对象/类的通用序列化程序。 让你的课程变得简单,做它应该做的事情。序列化不是一个人应该做的事情。

答案 4 :(得分: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()方法。我更新了上面的代码来说明它的用法。

答案 5 :(得分:0)

.NET XmlSerializer可以序列化任何类型。序列化元素都是pulic读/写属性。因此,PersonXmlSerializer已经存在; - )