Was ist der Punkt, der ISerializable-Schnittstelle?
-
03-07-2019 - |
Frage
Es scheint, wie ich Klassen serialisiert werden kann, die nicht über diese Schnittstelle haben, so bin ich nicht klar auf seinen Zweck erfüllt.
Lösung
ISerializable
wird verwendet, um benutzerdefinierte binäre Serialisierung zu schaffen, in der Regel für BinaryFormatter
(und vielleicht für Remoting-Zwecke). Ohne sie, verwendet er die Felder, die sein kann:
- ineffizient; wenn es Felder, die für Effizienz zur Laufzeit nur dann verwendet werden, können aber für die Serialisierung entfernt werden (zum Beispiel ein Wörterbuch kann anders aussehen, wenn serialisierte)
- ineffizient; als auch für Felder, die benötigt werden, es braucht viel zusätzliche Metadaten enthalten
- ungültig; wenn es Felder, die nicht serialisiert werden (wie Ereignis Delegierten, obwohl sie markiert
[NonSerialized]
werden kann) - spröde; jetzt Ihre Serialisierung auf das Feld Namen gebunden ist - aber Felder sollen eine Implementierung Detail sein; siehe auch Obfuscation, Serialisierung und automatisch implementiert Eigenschaften
Durch die Implementierung ISerializable
Sie Ihre eigenen binären Serialisierungsmechanismus zur Verfügung stellen kann. Beachten Sie, dass das XML-Äquivalent dieses IXmlSerializable
ist, und wurde von XmlSerializer
etc.
Für DTO Zwecke BinaryFormatter
vermieden werden sollte -. Dinge wie XML (via XmlSerializer
oder DataContractSerializer
) oder json sind gut, wie sind plattformübergreifende Formate wie Protokollpuffer
Für die Vollständigkeit, protobuf-net hat Haken für ISerializable
umfassen (so dass Sie ein tragbares Binärformat verwenden, ohne viel Code schreiben), aber BinaryFormatter
wäre Ihre erste Wahl nicht hier sowieso.
Andere Tipps
Der Unterricht kann in .NET in einer von zwei Möglichkeiten serialisiert werden:
- die Klasse mit
SerializableAttribute
Kennzeichnung und Dekoration all Felder, die Sie nicht will mit demNonSerialized
Attribute serialisiert werden. (Wie Marc GRA weist darauf hin,BinaryFormatter
, die die Klasse ist in der Regel verwendetISerializable
Objekte zu formatieren, serialisiert automatisch alle Felder, sofern sie nicht anderweitig ausdrücklich gekennzeichnet sind.) - Die Umsetzung der
ISerializable
Schnittstelle für die voll benutzerdefinierte Serialisierung.
Das erstere ist einfacher zu verwenden, da es einfach Erklärungen mit Attributen Markierung beinhaltet, ist aber in ihrer Macht beschränkt. Letzteres ermöglicht mehr Flexibilität, sondern nimmt erheblich mehr Aufwand zu implementieren. Welches Sie hängt ganz vom Kontext verwendet werden soll.
In Bezug auf letzteren (ISerializable
) und Nutzung habe ich von der MSDN-Seite für die Schnittstelle:
Jede Klasse, die serialisiert werden könnte muss mit der gekennzeichnet sein SerializableAttribute. Wenn eine Klasse muss ihre Serialisierung steuern Dabei kann es die Umsetzung ISerializable Schnittstelle. der Formatter ruft das GetObjectData an Serialisierung und füllt die Zeit mitgelieferten SerializationInfo mit allen die Daten, die erforderlich darzustellen Objekt. Der Formatter erzeugt ein SerializationInfo mit der Art der Objekt in dem Graphen. Objekte, die brauchen Proxies schicken für sich nutzen können die FullTypeName und Assembly Methoden auf SerializationInfo zu ändern die übertragenen Informationen.
Im Fall der Klassenvererbung, es möglich ist, eine Klasse serialisiert werden, dass leitet sich von einer Basisklasse, die ISerializable implementiert. In diesem Fall sollte der abgeleiteten Klasse aufrufen die Basisklasse Umsetzung GetObjectData in seinem Umsetzung von GetObjectData. Andernfalls werden die Daten von der Basis Klasse nicht serialisiert werden.
Mit dem ISerializable
können Sie benutzerdefinierte Methoden in Ihrem Objekt schreiben über die Serialisierung zu nehmen, wenn binäre Serialisierung zu tun, Ihre Objekte in einer anderen Art und Weise serialisiert wird als das, was der Standard-Ansatz von BinaryFormatter verwendet, tun wird.
Mit anderen Worten, wenn der Standard-Ansatz Ihr Objekt in einer anderen Art und Weise serialisiert als wie Sie es wollen serialisiert wie können Sie ISerializable für die vollständige Kontrolle implementieren. Beachten Sie, dass Hand in Hand mit ISerializable, gibt es auch einen benutzerdefinierten Konstruktor sollten Sie implementieren.
XmlSerialization nur natürlich Eigenschaften verwenden, ISerializable hat nichts mit XML-Serialisierung zu tun.
Danke Marc und Pop für die Kommentare, ich war ein bisschen voreilig mit meiner ersten Antwort.
Um ein Objekt „transportabel“ zu machen, haben Sie es serialisieren. Zum Beispiel, wenn Sie Objektdaten unter Verwendung von .NET Remoting oder Web Services Sie zu bieten haben Methoden zu übertragen, die Ihre Objektdaten serialisiert, Ihre Objektinstanzen in ein transportables Format zu reduzieren, die eine High-Fidelity-Darstellung des Objekts darstellt.
Sie dann auch die serialisierte Darstellung annehmen können, transportieren sich in einem anderen Kontext wie eine andere Maschine, und Ihr ursprüngliches Objekt neu zu erstellen.
Wenn die ISerializable
Schnittstelle implementiert, muss eine Klasse die GetObjectData Verfahren bereitzustellen, die in der Schnittstelle enthalten ist, sowie eine spezialisierte Konstruktor, spezialisiert zwei Parameter zu akzeptieren. Eine Instanz von SerializationInfo, und eine Instanz von Streaming
Wenn Sie Ihre Klassen benötigen keine feinkörnige Kontrolle über ihren Objektzustand, dann könnte man nur [Serializable]
Attribut verwenden. Klassen, die mehr Kontrolle über die Serialisierung erfordern, können die ISerializable-Schnittstelle implementieren.