Antworten:
Wenn Sie ein Objekt in einer .NET Framework-Anwendung erstellen, müssen Sie nicht darüber nachdenken, wie die Daten im Speicher gespeichert werden. Weil das .Net Framework das für Sie erledigt. Wenn Sie jedoch den Inhalt eines Objekts in einer Datei speichern, ein Objekt an einen anderen Prozess senden oder über das Netzwerk übertragen möchten, müssen Sie überlegen, wie das Objekt dargestellt wird, da Sie in ein anderes Format konvertieren müssen . Diese Konvertierung wird als SERIALISIERUNG bezeichnet.
Durch die Serialisierung kann der Entwickler den Status eines Objekts speichern und bei Bedarf neu erstellen, um Objekte zu speichern und Daten auszutauschen. Durch die Serialisierung kann ein Entwickler Aktionen ausführen, z. B. das Senden des Objekts an eine Remoteanwendung mithilfe eines Webdienstes, das Übergeben eines Objekts von einer Domäne an eine andere, das Übergeben eines Objekts durch eine Firewall als XML-Zeichenfolge oder das Aufrechterhalten der Sicherheit oder benutzerspezifisch Informationen über Anwendungen hinweg.
Auf SerializableAttribute
einen Typ anwenden , um anzugeben, dass Instanzen dieses Typs serialisiert werden können. Wenden Sie das SerializableAttribute
Even an, wenn die Klasse auch die ISerializable
Schnittstelle implementiert , um den Serialisierungsprozess zu steuern.
Alle öffentlichen und privaten Felder in einem Typ, die mit gekennzeichnet SerializableAttribute
sind, werden standardmäßig serialisiert, es sei denn, der Typ implementiert die ISerializable
Schnittstelle, um den Serialisierungsprozess zu überschreiben. Der Standard-Serialisierungsprozess schließt Felder aus, die mit gekennzeichnet sind NonSerializedAttribute
. Wenn ein Feld eines serialisierbaren Typs einen Zeiger, ein Handle oder eine andere Datenstruktur enthält, die für eine bestimmte Umgebung spezifisch ist und in einer anderen Umgebung nicht sinnvoll wiederhergestellt werden kann, möchten Sie möglicherweise NonSerializedAttribute
auf dieses Feld anwenden .
Weitere Informationen finden Sie unter MSDN .
Bearbeiten 1
Jeder Grund, etwas nicht als serialisierbar zu markieren
Beim Übertragen oder Speichern von Daten müssen Sie nur die erforderlichen Daten senden oder speichern. So treten weniger Übertragungsverzögerungen und Speicherprobleme auf. So können Sie beim Serialisieren unnötige Datenblöcke deaktivieren.
Einige praktische Anwendungen für das [Serializable]
Attribut:
BinaryFormatter
Klasse in System.Runtime.Serialization.Formatters.BinaryClipboard.SetData()
- nicht serialisierbaren Klassen in der Zwischenablage gespeichert werden können, kann nicht in die Zwischenablage gestellt werden.MarshalByRefObject
), serialisierbar sein.Dies sind die häufigsten Anwendungsfälle, auf die ich gestoßen bin.
Da es sich bei der ursprünglichen Frage um das SerializableAttribute handelte, sollte beachtet werden, dass dieses Attribut nur bei Verwendung von BinaryFormatter oder SoapFormatter gilt.
Es ist etwas verwirrend, es sei denn, Sie achten wirklich auf die Details, wann Sie es verwenden und was sein eigentlicher Zweck ist.
Es hat NICHTS mit XML- oder JSON-Serialisierung zu tun.
Mit dem SerializableAttribute werden die ISerializable-Schnittstelle und die SerializationInfo-Klasse verwendet. Diese werden auch nur mit dem BinaryFormatter oder SoapFormatter verwendet.
Wenn Sie nicht beabsichtigen, Ihre Klasse mit Binary oder Soap zu serialisieren, markieren Sie Ihre Klasse nicht als [serialisierbar]. XML- und JSON-Serialisierer sind sich ihrer Existenz nicht einmal bewusst.
Serializable
und ohne, wenn das Attribut entfernt wurde. So ist eine Störung möglich.
Bei der Serialisierung wird ein Objekt in einen Bytestrom konvertiert, um das Objekt zu speichern oder in den Speicher, eine Datenbank oder eine Datei zu übertragen.
Wie Serialisierung funktioniert
Diese Abbildung zeigt den gesamten Serialisierungsprozess.
Das Objekt wird in einen Stream serialisiert, der nicht nur die Daten enthält, sondern auch Informationen über den Objekttyp, wie z. B. Version, Kultur und Assemblyname. Von diesem Stream kann es in einer Datenbank, einer Datei oder einem Speicher gespeichert werden.
Hier ist ein kurzes Beispiel für die Funktionsweise der Serialisierung. Ich habe auch etwas darüber gelernt und fand zwei Links nützlich. Was Serialisierung ist und wie es in .NET getan werden .
Ein Beispielprogramm zur Erläuterung der Serialisierung
Wenn Sie nicht verstehen , das obige Programm ein sehr einfaches Programm , mit Erklärung gegeben ist hier .
Serialisierung
Bei der Serialisierung wird ein Objekt oder eine Reihe von Objektgraphen in einen Stream konvertiert. Bei der binären Serialisierung handelt es sich um ein Byte-Array
Verwendung der Serialisierung
Im Folgenden finden Sie einige nützliche benutzerdefinierte Attribute, die während der Serialisierung eines Objekts verwendet werden
[Serializable] -> Wird verwendet, wenn wir das serialisierbare Objekt markieren. [NonSerialized] -> Wird verwendet, wenn das Feld eines Objekts nicht serialisiert werden soll. [OnSerializing] -> Wird verwendet, wenn beim Serialisieren eines Objekts eine Aktion ausgeführt werden soll. [OnSerialized] -> Wird verwendet, wenn nach dem Serialisieren eines Objekts in den Stream eine Aktion ausgeführt werden soll.
Unten sehen Sie ein Beispiel für die Serialisierung
[Serializable]
internal class DemoForSerializable
{
internal string Fname = string.Empty;
internal string Lname = string.Empty;
internal Stream SerializeToMS(DemoForSerializable demo)
{
DemoForSerializable objSer = new DemoForSerializable();
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, objSer);
return ms;
}
[OnSerializing]
private void OnSerializing(StreamingContext context) {
Fname = "sheo";
Lname = "Dayal";
}
[OnSerialized]
private void OnSerialized(StreamingContext context)
{
// Do some work after serialized object
}
}
Hier ist der aufrufende Code
class Program
{
string fname = string.Empty;
string Lname = string.Empty;
static void Main(string[] args)
{
DemoForSerializable demo = new DemoForSerializable();
Stream ms = demo.SerializeToMS(demo);
ms.Position = 0;
DemoForSerializable demo1 = new BinaryFormatter().Deserialize(ms) as DemoForSerializable;
Console.WriteLine(demo1.Fname);
Console.WriteLine(demo1.Lname);
Console.ReadLine();
}
}
What is it?
stackoverflow.com/questions/3429921/what-does-serializable-mean