2009-03-03 11 views
3

Ich bin verwirrt über die Serialisierungsprobe von MSDN.GetObjectData auf Serialisierung aufrufen

My Verwirrung in Methode GetObjectData (die während der Serialisierung genannt wird), wird das Verfahren,

  1. Serialisieren sowohl die zusätzlichen Daten (in Methode GetObjectData von AddValue) und die Felder/Eigenschaften der Klasse;
  2. oder schreiben Sie einfach die Daten in der Methode GetObjectData, ohne Felder/Eigenschaften der Klasse zu schreiben?

Ich habe debuggt scheint (2) ist korrekt - keine Felder/Eigenschaften Daten serialisiert werden, wenn GetObjectData Methode verwendet wird? Ist das korrekt? (Ich bin kein Experte und will einfach nur hier, um zu bestätigen, aber 100% sicher über mich.)

Antwort

2

Wenn Sie ISerializable implementieren, Sie sind reasponsible für alle Daten (d Szenario „2“ in Ihrer Frage); nichts extra wird automatisch serialisiert. Was ist Ihre Anforderung? Dinge wie DataContractSerializer können eigenschaftsbasiert sein, so dass Sie sowohl die regulären Felder als auch Ihre benutzerdefinierte Eigenschaft (die eine gewisse Logik hat) dekorieren und sie ordnungsgemäß serialisieren lassen. Wenn du binär (für Platz usw.) brauchst, dann bedenke vielleicht Dinge wie protobuf-net, die beide mischt, während sie platzsparend sind.

Also: Was sind Ihre Anforderungen?

Daten Kontrakt Beispiel:

[DataContract] 
public class Foo { 
    [DataMember] 
    public int Bar {get;set;} // simple data 

    [DataMember] 
    private string DoSomeThinking { 
     get {.... serialize the complex data ....} 
     set {.... deserialize the complex data ....} 
    } 
} 
+0

Oder für binäre mit dem oben genannten, können Sie NetDataContractSerializer verwenden: http://msdn.microsoft.com/en-us/library/system.runtime.serialization.netdatacontractserializer.aspx –

+0

Danke Marc! Was sind die Unterschiede zwischen der Implementierung von ISerializable Interface vs. mit [Serializable] -Attribut markieren? – George2

+1

Das Markieren als [Serializable] sagt einfach "es ist OK, dieses zu serialisieren"; Die meisten Serialisierungs-Engines werden dies erkennen und Felder (Implementierung) oder Eigenschaften (Verträge) automatisch serialisieren. ISerializable wird von BinaryFormatter für ** benutzerdefinierte ** Serialisierung verwendet, wobei * Sie * die Binärdatei steuern. –

2

Wenn Sie ISerializable implementieren Sie alle Daten hinzufügen müssen (zumindest die erforderlichen Daten für die deserialisieren) einschließlich aller Felder der SerializationInfo AddValue verwenden.

+0

Ist die Implementierung von ISerializable-Schnittstelle vs. gleich mit [Serializable] -Attribut markieren? – George2

+1

Wenn Sie ISerializable implementieren, müssen Sie Ihre Klasse auch mit [Serializable] markieren. Wenn Sie der Serialisierung keine zusätzlichen Informationen hinzufügen möchten und Ihre Klasse relativ einfach ist, müssen Sie ISerializable nicht implementieren. –

+1

Alles, was Sie tun müssen, ist mit [Serializable] markieren und die Laufzeit wird die ganze Arbeit machen. –

2

Ich bin nicht sicher, was Sie erreichen wollen, ist aber nicht einfacher C# tun, um die Arbeit für Sie zu lassen:

using System; 
using System.Collections.Generic; 
using System.Xml.Serialization; 

namespace Test 
{ 
    [Serializable] 
    public class TestObject 
    { 
     private String name; 
     private String note; 
     #region Getters/setters 

     public String Name 
     { 
      get { return name; } 
      set { name = value; } 
     } 

     public String Note 
     { 
      get { return note; } 
      set { note = value; } 
     } 
     #endregion 
    } 
} 

Jetzt können Sie die XmlSerializer oder BinaryFormatter zu (de) verwenden serialisiert das Objekt

+0

Ist das Gleiche zu implementieren ISerializable-Schnittstelle vs. mit [Serializable] -Attribut markieren? – George2

+0

Von MSDN: "Jede Klasse, die serialisiert werden könnte, muss mit dem SerializableAttribute markiert sein. Wenn eine Klasse ihren Serialisierungsprozess steuern muss, kann sie die ISerializable-Schnittstelle implementieren." Das Ergebnis ist das gleiche, aber das Attribut macht die Arbeit für Sie – RvdK

+0

Danke PoweRoy, ich habe getestet, wenn mit Serializable-Attribut markiert, werden alle öffentlichen Felder automatisch serialisiert, aber wenn beide mit Serializable markiert und implementiert ISerializable-Schnittstelle (aber macht GetObjectDate leer), nichts wird geschrieben. So seltsam. Irgendwelche Kommentare? – George2

Verwandte Themen