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.

War es hilfreich?

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:

  1. die Klasse mit SerializableAttribute Kennzeichnung und Dekoration all Felder, die Sie nicht will mit dem NonSerialized Attribute serialisiert werden. (Wie Marc GRA weist darauf hin, BinaryFormatter, die die Klasse ist in der Regel verwendet ISerializable Objekte zu formatieren, serialisiert automatisch alle Felder, sofern sie nicht anderweitig ausdrücklich gekennzeichnet sind.)
  2. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top