2014-03-03 5 views
11

Ich habe versucht, die ISerializable und ratlos auf diesem. Ich habe zwei Klassen mit dem Attribut "Serialisierbar" gemacht. Nur eine Klasse wurde von ISerializable abgeleitet und GetObjectData wurde dafür definiert. Nennen wir diese Klasse A. Eine andere wurde nicht von ISerializable abgeleitet, da GetObjectData dafür nicht definiert wurde. Lassen Sie uns diese Klasse als B nennen. Ich habe keinen speziellen Konstruktor für die Klasse A zur Verfügung gestellt. Jetzt zeigt Klasse A in der Laufzeit den Fehler wie "Spezialkonstruktor fehlt". Die Syntax ist für beide Klassen gleich. Der Fehler kann also eine andere Sache sein, aber es sollte nicht den Konstruktor betreffen. Ansonsten sollte ich den gleichen Fehler auch für Klasse B bekommen. Siehe den folgenden Code. Kann jemand den Grund dafür sagen?
Anmerkung: Ich bin windows 7 mit - 64 Bit mit Visual Studio 2010.Der Konstruktor zum Deserialisieren eines Objekts vom Typ T wurde nicht gefunden

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Runtime.Serialization; 
using System.Runtime.Serialization.Formatters.Binary; 
using System.IO; 

namespace Delete_This 
{ 
    [Serializable] 
    class After_Implementing_ISerializable:ISerializable 
    { 
     int a; 
     string b; 
     public After_Implementing_ISerializable(int a, string b) 
     { 
      this.a = a; 
      this.b = b; 
     } 
     public void GetObjectData(SerializationInfo info, StreamingContext context) 
     { 

     } 
     public void Check() 
     { 
      After_Implementing_ISerializable s = new After_Implementing_ISerializable(15, "100"); 
      FileStream fs = new FileStream("temp.xml", FileMode.OpenOrCreate); 

      BinaryFormatter bf = new BinaryFormatter(); 
      bf.Serialize(fs, s); 
      fs.Close(); 

      fs = new FileStream("temp.xml", FileMode.OpenOrCreate); 
      After_Implementing_ISerializable d = (After_Implementing_ISerializable)bf.Deserialize(fs); 
      fs.Close(); 
     } 
    } 

    [Serializable] 
    class Without_Implementing_ISerializable 
    { 
     int a; 
     string b; 
     public Without_Implementing_ISerializable(int a,string b) 
     { 
      this.a = a; 
      this.b = b; 
     } 

     public void Check() 
     { 
      Without_Implementing_ISerializable s = new Without_Implementing_ISerializable(15, "100"); 
      FileStream fs = new FileStream("temp.xml", FileMode.OpenOrCreate); 

      BinaryFormatter bf = new BinaryFormatter(); 
      bf.Serialize(fs, s); 
      fs.Close(); 

      fs = new FileStream("temp.xml", FileMode.OpenOrCreate); 
      Without_Implementing_ISerializable d = (Without_Implementing_ISerializable)bf.Deserialize(fs); 
      fs.Close(); 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
     Without_Implementing_ISerializable s = new Without_Implementing_ISerializable(5,"Five"); 
      s.Check(); 

      After_Implementing_ISerializable s1 = new After_Implementing_ISerializable(6, "Six"); 
      s1.Check(); 
     } 
    } 
} 

Ja Dies ist der Fehler, den ich bekam

"The constructor to deserialize an object of type 'Delete_This.After_Implementing_ISerializable' was not found."} 
+0

@Raymond danke für die nette Bearbeitung zum Thema – prabhakaran

Antwort

24

, benötigen Sie einen Serialisierung Konstruktor für Typen implementieren Implementieren ISerializable; Dieser Serialisierungskonstruktor ist verantwortlich für die Deserialisierung des Objekts, wie dies für die Serialisierung unter Verwendung der GetObjectData-Methode der Fall war.

Serialisierungskonstruktor wird etwa so aussehen, mit dem ersten Parameter SerializationInfo und zweiten StreamingContext.

protected ClassName(SerializationInfo info, StreamingContext context) 
{ 

} 

Bemerkungen Abschnitt im bereitgestellten Link spricht über dieses Thema.

ISerializable Die Schnittstelle beinhaltet einen Konstruktor mit der Signatur Konstruktor (SerializationInfo Informationen Streaming Kontext). Zur Deserialisierungszeit wird der aktuelle Konstruktor erst nach aufgerufen. Die Daten in der SerializationInfo wurden vom Formatierer deserialisiert. Im Allgemeinen sollte dieser Konstruktor geschützt werden, wenn die Klasse nicht versiegelt ist.

+0

Ich stimme Ihrem Vorschlag zu, einen Konstruktor zu beschreiben. Meine Frage ist in beiden Klassen Check() Funktion hat die gleiche Syntax. Sehen Sie das Objekt d an beiden Orten. Wie kommt es dann, dass die Laufzeit für nur einen Fehler anzeigt? Schnittstelle kann nichts in Bezug auf Konstruktor implementieren. Der Fehler betrifft Konstruktor. Das ist der Punkt, der mich verwirrt. – prabhakaran

+0

@prabhakaran Fehle ich etwas? Ihre zweite Klasse implementiert keine 'ISerializable'-Schnittstelle, daher wird dieser Konstruktor dort nicht benötigt. Dies ist obligatorisch für Typen, die eine 'ISerializable' Schnittstelle implementieren. –

+0

@SriramCan Sie müssen nur einen Code eingeben, um die erste Zeile zu erklären. Ich denke, dieser Punkt kann alle Dinge klären.- – prabhakaran

Verwandte Themen