Javaのシリアル化可能またはクローン可能なクローン可能なようなマーカーインターフェイスの設計は、C#で進化しましたか?
-
26-10-2019 - |
質問
Javaが提供します java.io.Serializable
と java.lang.Cloneable
彼の標準的なライブラリ(および言語での特別なサポートとJVM)では、脱派化/シリアル化/クローニングに関するタスクについて。
C#はこの機能を提供するための別のパスを選択しましたか?それを使用した実装とコードはJavaとどのように異なり、なぜこのように行われたのですか?
例として、なぜC#は属性(アノテーション)とシリアル化にインターフェイスの両方を使用するのですか?
解決
.NETは使用しません ISerializable
単なるマーカーインターフェイスとして。マーカーとして機能するだけでなく、.NETが実装してクラスをシリアル化する方法を正確に制御することもできます GetObjectData
適切な議論を取るコンストラクター。
属性は、クラスをシリアル化できるときに使用されますが、独自のシリアル化動作を定義したくありません。
SO:使用してください ISerializable
独自のシリアル化動作を定義したい場合。または使用します [Serializable]
属性あなたがそれをシリアル化のフォーマッタに任せたいとき。
私はそれを進化と呼びますか?知らない。 .NETは、さまざまな程度の柔軟性を提供するだけです。
他のヒント
シリアル化について何かが必要な場合: これをチェックして
C#が進化したとは思わない。むしろ、彼らは両方のものを修正しました:
Javaのシリアル化はそれほどきれいではありません。脱派化には、コンストラクターを呼び出すことなくオブジェクト「作成」が含まれます。 仕様 あなたが興味があるなら。
Cloneable
ただ壊れているだけです。マーカーインターフェイスではありませんが、clone()
方法。あなたが持っているようにCloneable
sできませんclone()
.
基本的に、Javaには、主に1。2日以前のものから、非常に壊れている/混乱している/汚れたものがたくさんあります。
「Evolved」とはどういう意味かはわかりません。もしあれば、その傾向はマーカーインターフェイスではなく属性に向かっていると思います。 Javaが最近そのように行ったかどうかはわかりません。
たとえば、CLRのシリアル化は、属性を備えた最も基本的な形式で証明されていますが、必要な場合はプロセスをより制御できるいくつかの非マーカーインターフェイスを実装できます。
マーカーインターフェイスは、おそらくJavaで実施された最悪の決定の1つです。誰もインターフェイスでpublic clone()メソッドを定義した人はいないため、役に立たないクローン可能がどのようになったかを見てください。
.NETはその方向に進まない(少なくともその方向のインターフェイスを認識していない)ことは進化の少ないものではなく、概念全体の放棄です。ますます取られていると思われる別の方向は注釈であるように思われます。これは「マーカー」と見なすことができると思いますが、より基本的なレベルです(たとえば、Javaが今日実装されたかどうかは注釈であり、注釈であり、予選ではありません)