Javaはjava.io.Serializable
、java.lang.Cloneable
彼の標準ライブラリ(および言語とJVMでの特別なサポート)で、逆シリアル化/シリアル化/クローン作成に関するタスクを提供します。
C#はこの機能を提供するために別のパスを選択しましたか?それを使用する実装とコードはJavaとどのように異なり、なぜこのように行われたのですか?
例として、C#がシリアル化に属性(アノテーション)とインターフェイスの両方を使用するのはなぜですか?
Javaはjava.io.Serializable
、java.lang.Cloneable
彼の標準ライブラリ(および言語とJVMでの特別なサポート)で、逆シリアル化/シリアル化/クローン作成に関するタスクを提供します。
C#はこの機能を提供するために別のパスを選択しましたか?それを使用する実装とコードはJavaとどのように異なり、なぜこのように行われたのですか?
例として、C#がシリアル化に属性(アノテーション)とインターフェイスの両方を使用するのはなぜですか?
.NET はISerializable
単なるマーカー インターフェイスとして使用しません。GetObjectData
マーカーとして機能するだけでなく、適切な引数を取るコンストラクターを実装することで、.NET がクラスをシリアル化する方法を正確に制御することもできます。
この属性は、クラスをシリアル化できるが、独自のシリアル化動作を定義したくない場合に使用されます。
そのため:ISerializable
独自のシリアライゼーション動作を定義する場合に使用します。または[Serializable]
、シリアライゼーション フォーマッタに任せたい場合に属性を使用します。
それを進化と呼べるのか?知らない。.NET は、さまざまな程度の柔軟性を提供しているだけです。
シリアル化について何か必要な場合:これを確認してください
C# が進化したとは思いません。むしろ、彼らは両方を修正しました:
Java でのシリアライゼーションはあまりきれいではありません。デシリアライゼーションには、コンストラクターを呼び出さずにオブジェクトの「作成」が含まれます。プロセス全体に、プライベート メソッドを呼び出すランタイムを含めることができます。興味がある場合は、仕様を確認してください。
Cloneable
単純に壊れています。マーカー インターフェイスではなく、clone()
メソッドを指定する必要があります。そのままではありCloneable
ませんclone()
。
基本的に、Java には、主に 1.2 日前から、かなり壊れている/台無しになっている/汚れている/その他のものがたくさんあります。
マーカーインターフェイスは、おそらくJavaでこれまでに実装された中で最悪の決定の1つです。インターフェースでpublicclone()メソッドを定義した人は誰もいないので、Cloneableがどれほど役に立たないかを見てください。
.NETがその方向に進まない(少なくとも私はその方向のインターフェースを認識していません)のは、進化ではなく、概念全体の放棄です。ますます取られているように見える別の方向は注釈であるように思われます。これは「マーカー」として見ることができると思いますが、より基本的なレベルです(たとえば、Javaが今日実装された場合、一時的なものは注釈であり、修飾子ではありません)
「進化した」とはどういう意味かわかりませんが、どちらかといえば、トレンドはマーカーインターフェイスではなく属性に向かっていると思います。Javaも最近そのようになったかどうかはわかりません。
たとえば、CLR でのシリアル化は、属性を使用した最も基本的な形式で証明されますが、必要に応じて、プロセスをより詳細に制御できるいくつかの非マーカー インターフェイスを実装できます。