Hat sich das Design von Marker -Schnittstellen wie das serialisierbare oder klonbare Klonable von Java in C#entwickelt?
-
26-10-2019 - |
Frage
Java bietet java.io.Serializable
und java.lang.Cloneable
in seiner Standardbibliothek (und besondere Unterstützung für die Sprache und der JVM) für Aufgaben zur Deserialisierung/Serialisierung/Klonen.
Hat C# einen anderen Weg gewählt, um diese Funktionalität bereitzustellen, wie unterscheidet sich die Implementierung und den Code von Java und warum wurde sie so gemacht?
Warum verwendet C# als Beispiel sowohl ein Attribut (Annotation) als auch eine Schnittstelle zur Serialisierung?
Lösung
.NET verwendet nicht ISerializable
als markierende Schnittstelle. Es fungiert nicht nur als Marker, sondern ermöglicht es Ihnen auch, genau zu steuern, wie .NET die Klasse durch Implementierung serialisieren wird GetObjectData
und ein Konstruktor, der die geeigneten Argumente nimmt.
Das Attribut wird verwendet, wenn die Klasse serialisiert werden kann, aber Sie möchten Ihr eigenes Serialisierungsverhalten nicht definieren.
Also: Verwenden ISerializable
Wenn Sie Ihr eigenes Serialisierungsverhalten definieren möchten; oder verwenden Sie die [Serializable]
Attribut, wenn Sie es dem Serialisierungsformater überlassen möchten.
Würde ich es Evolution nennen? Ich weiß nicht. .NET bietet Ihnen nur unterschiedliche Flexibilität.
Andere Tipps
Wenn Sie etwas über die Serialisierung wollen: Überprüfen Sie dies
Ich glaube nicht, dass C# sich weiterentwickelt hat. Vielmehr haben sie beide Dinge repariert:
Die Serialisierung in Java ist nicht sehr sauber: Deserialisierung beinhaltet Objekt "Erstellung", ohne einen Konstruktor aufzurufen. Der gesamte Prozess kann die Laufzeit -Rennstufe private Methoden usw. enthalten. die technischen Daten Wenn Sie neugierig sind.
Cloneable
ist einfach einfach gebrochen. Es sollte keine Markierungsschnittstelle sein, sondern die angebenclone()
Methode. Wie du hastCloneable
s können Sie nichtclone()
.
Grundsätzlich gibt es viele Dinge in Java, hauptsächlich aus den Tagen vor 1,2 Tagen, die ziemlich gebrochen/durcheinander/unrein/was auch immer sind.
Ich bin mir nicht sicher, was Sie unter "Evolved" meinen, wenn ich denke, der Trend geht eher zu Attributen als zu Marker -Schnittstellen. Ich weiß nicht, ob Java in letzter Zeit auch so gegangen ist.
Die Serialisierung in der CLR wird beispielsweise in ihrer grundlegendsten Form mit Attributen gezeigt, obwohl Sie einige nicht-marker-Schnittstellen implementieren können, die Ihnen mehr Kontrolle über den Prozess geben, wenn Sie ihn benötigen.
Marker -Schnittstellen sind wahrscheinlich eine der schlimmsten Entscheidungen, die jemals in Java implementiert wurden. Ich meine, schau dir nur an, wie nutzlos klonbar war, weil niemand eine öffentliche Klon () -Methode in der Schnittstelle definiert hat.
.NET, die nicht in diese Richtung geht (zumindest weiß ich keine Schnittstellen in dieser Richtung) ist weniger eine Entwicklung und vielmehr eine Aufgabe des gesamten Begriffs. Eine andere Richtung, die immer mehr eingenommen zu werden scheint, scheint Annotationen zu sein, die ich davon ausgehe, dass Sie als "Marker" sehen können, aber auf grundlegenderer Ebene (z. B. bin ich mir ziemlich sicher, ob Java heute transient implementiert wäre und eine Annotation und eine Annotation sein würde und kein Qualifikationsspiel)