Was ist der Sinn der ISerializable-Schnittstelle?
Scheint es, wie kann ich Klassen serialisieren, die nicht über das interface, also ich bin unklar, auf seinen Zweck.
InformationsquelleAutor der Frage leora | 2009-05-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
ISerializable
wird verwendet, um benutzerdefinierte binäre Serialisierung, in der Regel fürBinaryFormatter
(und vielleicht für remoting-Zwecken). Ohne es, es verwendet die Felder, die sein können:[NonSerialized]
)Durch die Umsetzung
ISerializable
Sie können Ihre eigene binäre Serialisierung Mechanismus. Beachten Sie, dass die xml-Pendant istIXmlSerializable
wieXmlSerializer
etc.Für DTO Zwecke
BinaryFormatter
sollte vermieden werden - Dinge wie xml (viaXmlSerializer
oderDataContractSerializer
) oder json sind gut, ebenso die cross-Plattform-Formate wie protocol buffers.Für die Vollständigkeit, protobuf-net beinhaltet nicht die Haken für
ISerializable
(da Sie eine portable Binär-format ohne schreiben viel code), aberBinaryFormatter
wäre nicht Ihre erste Wahl ist hier auf jeden Fall.InformationsquelleAutor der Antwort Marc Gravell
Klassen können serialisiert werden .NET in einer von zwei Möglichkeiten:
SerializableAttribute
und dekorieren Sie alle Felder, die Sie nicht wollen serialisiert werden, bei derNonSerialized
Attribut. (Als Marc Gravell Punkte aus,BinaryFormatter
der die Klasse in der Regel verwendet, um formatISerializable
Objekte, automatisch serialisiert alle Felder, es sei denn, Sie sind ausdrücklich anders gekennzeichnet.)ISerializable
Schnittstelle für eine vollständig benutzerdefinierte Serialisierung.Ersteres ist einfacher zu verwenden, da es lediglich um die Kennzeichnung Deklarationen von Attributen, aber begrenzt in Ihrer macht. Letzteres ermöglicht mehr Flexibilität, braucht aber deutlich mehr Aufwand zu implementieren. Welche Sie verwenden sollten, hängt ganz vom Kontext.
Bezüglich der letzteren (
ISerializable
) und it-Nutzung, ich habe zitiert aus dem MSDN-Seite für die Schnittstelle:InformationsquelleAutor der Antwort Noldorin
Mit der
ISerializable
schreiben Sie benutzerdefinierte Methoden in das Objekt zu übernehmen, Serialisierung, wenn dabei die binäre Serialisierung serialisieren Objekte in einer anderen Weise als das, was die Standard-Vorgehensweise von BinaryFormatter tun.In anderen Worten, wenn der Standard-Ansatz serialisiert das Objekt in einer anderen Weise als die, wie Sie wollen, es zu serialisieren, Sie ISerializable implementieren Sie die vollständige Kontrolle. Beachten Sie, dass hand in hand mit ISerializable, es gibt auch einen benutzerdefinierten Konstruktor, die Sie implementieren sollten.
XmlSerialization wird natürlich nur verwenden, Eigenschaften, ISerializable hat nichts zu tun mit der XML-Serialisierung.
Dank Marc und Pop für die Kommentare, ich war etwas voreilig mit meiner ersten Antwort.
InformationsquelleAutor der Antwort Lasse Vågsæther Karlsen
Um ein Objekt "transportable", die Sie haben, um es zu serialisieren. Zum Beispiel, wenn Sie möchten, transfer-Objekt-Daten mit .NET Remoting oder Web-Services Methoden, die Ihr Objekt serialisiert die Daten, die Reduzierung Ihrer Objekt-Instanzen in einem transportablen format, dass ein high-fidelity-Darstellung des Objekts.
Dann kann auch die serialisierte Darstellung, transportieren Sie zu einem anderen Kontext, wie eine andere Maschine, und erstellen Sie den original-Objekt.
Bei der Umsetzung der
ISerializable
interface muss eine Klasse bereitstellen, die GetObjectData-Methode enthalten ist, die in der Schnittstelle, sowie einen spezialisierten Konstruktor, der spezialisiert ist, zu akzeptieren zwei Parameter: eine Instanz SerializationInfo, und ein StreamingContext-Instanz.Wenn Sie Ihre Klassen nicht erfordern eine fein abgestimmte Kontrolle der Objekt-Zustand ist, dann könnte man nur verwenden
[Serializable]
Attribut. Klassen, die erfordern mehr Kontrolle über die Serialisierung kann der Prozess implementieren Sie die ISerializable-Schnittstelle.InformationsquelleAutor der Antwort splattne