【问题标题】:Implementing ISerializable unnecessary?实现 ISerializable 不必要吗?
【发布时间】:2013-10-21 03:21:43
【问题描述】:

我很难理解 ISerializable 接口的必要性......我想我在这个主题中遗漏了一些非常重要的东西,所以如果有人能帮帮我,我将不胜感激。

这很好用 -

[Serializable]
    class Student
    {
        public int age;
        public string name;

        public Student()
        {
            age = 0;
            name = null;
        }
    }
 class Program
    {
        public static void Main()
        {
            Stream stream = File.Open("Test123.txt", FileMode.Create);

            BinaryFormatter bf = new BinaryFormatter();

            Student s1 = new Student();
            s1.name = "Peter";
            s1.age = 50;
            bf.Serialize(stream, s1);

            stream.Close();

            Stream stream2 = File.Open("Test123.txt", FileMode.Open);

            Student s2 = (Student)bf.Deserialize(stream2);

            Console.WriteLine(s2.age);

        }

它在没有实现 ISerializable 和覆盖 GetObjectData() 的情况下工作。 为何如此?那么接口有什么用呢?

谢谢。

【问题讨论】:

标签: c# serialization


【解决方案1】:

Serializable 使用默认序列化。 ISerializable 接口的重点是重写序列化,以便您可以拥有自己的。

【讨论】:

  • 当我只想转换对象的一些数据时,我应该需要一个“自定义”序列化过程?
  • 通常情况下,您不需要自定义序列化。如果您特别希望使用自己的格式化程序,例如BinaryFormatter、SoapFormatter 等,那么您可能想要实现 ISerializable 接口。
  • @Marc Gravell 对这个话题阐述得非常好:stackoverflow.com/questions/810974/…
  • 对不起,我读错了你的后续问题,是的,这将是使用自定义序列化的原因之一。
【解决方案2】:

除了@Marcus 回答之外,Serializable 和 ISerializable 仅适用于 .Net 中内置的 *Formatter(通常为 BinaryFormatterSoapFormatter)序列化程序

如果属性存在但接口不存在,他们将使用反射来查找所有属性及其值。

不同的序列化程序有不同的自定义序列化方式(尽管大多数都可以选择只使用反射)

例如,XmlSerializer 有一个不同的接口,IXmlSerializable,并且也不检查Serializable 属性。查看文档以了解您使用的序列化程序以了解故事内容。例如,Wcf 使用 DataContract 属性来确定序列化的方式和内容

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 2018-01-21
    • 2012-09-17
    • 2015-01-07
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多