Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 混淆我应该将函数分配给哪个对象_C#_Oop - Fatal编程技术网

C# 混淆我应该将函数分配给哪个对象

C# 混淆我应该将函数分配给哪个对象,c#,oop,C#,Oop,我有以下两个类将对象转换为xml字符串 我应该做类似的事情吗 class Person { public string GetXml() { //return a xml string } } class PersonSerializer { public string Serialize(Person person) { // return a xml string } } 或

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

我应该做类似的事情吗

class Person
{

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

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

class Person
{

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

 }

谢谢

一般来说,
Serialize
方法应该在您想要序列化的类上;这样,它可以访问其他类无法访问的所有私有成员变量,并且通常可以更高效地执行操作。您可以创建可以序列化不同对象/类的通用序列化程序。
让你的类保持简单,做它应该做的事情。序列化不是一个人应该做的事情。

要问的问题是:一个人对XML了解多少

答案是:没有


因此,第三次投票选择一个单独的序列化程序。

要完成,您应该使用
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()
方法。我更新了上面的代码来说明它的用法。

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

您最初的问题实际上是询问是将序列化信息嵌入到它所属的类中,还是将其放置到一个单独但关联的类中。第一种方法的优点是序列化代码能够直接访问私有成员,并且与类紧密耦合。缺点是序列化代码会影响类的实际逻辑-如果您也添加二进制序列化,这一点会更加明显


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

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

是的,我同意,但我在.net类本身上看到了类似的例子:int int1=1;int1.ToString();我不认为单独上课是个好主意。他使用它只序列化Person对象。因此,我认为,对象本身应该知道如何序列化自身。ToString被视为一个低级项,它来自system.object,也是调试器中的默认字符串表示形式。妥协@好答案。悲哀地主题仍然错误。解析呢?;)这就是为什么要使用ISerializable和.NET serialization framework-以独立于格式的方式指定要反序列化的数据:)内置的.NET XmlSerializer很有用,但是它有一些限制,例如,如果要序列化链接的任何类上有任何接口,它将返回错误