1

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() をオーバーライドせずに機能しました。どうして?では、インターフェースの用途は何ですか?

ありがとう。

4

2 に答える 2

2

@Marcus の回答に加えて、Serializable と ISerializable は、.Net に組み込まれている *Formatter (通常は、BinaryFormatterおよび) シリアライザーにのみ適用されます。SoapFormatter

属性はあるがインターフェイスがない場合、リフレクションを使用してすべてのプロパティとその値を見つけます。

シリアライザーが異なれば、シリアライゼーションをカスタマイズする方法も異なります (ほとんどの場合、リフレクションを使用するオプションがあります)。

たとえば、XmlSerializer には異なるインターフェイスがあり、属性IXmlSerializableもチェックしません。Serializableストーリーが何であるかを確認するために使用しているシリアライザーのドキュメントをチェックしてください。たとえば、Wcf はDataContract属性を使用して、シリアル化する方法と対象を決定します。

于 2013-10-13T12:49:32.140 に答える