2017-06-07 2 views
1

Ich versuche, ein FormCollection-Objekt zu serialisieren, und basierend auf dem, was ich erforscht habe, erbt es NameObjectCollectionBase, so dass es auch GetObjectData und ISerializable erbt. Wäre das nicht serialisierbar?Wie Serialisieren und Deserialisieren von FormCollection?

https://msdn.microsoft.com/en-us/library/system.web.mvc.formcollection(v=vs.118).aspx

Hier ein Ausschnitt von dem, was ich versuche:

BinaryFormatter formatter = new BinaryFormatter(); 

//Serialize 
using (MemoryStream stream = new MemoryStream()) 
{ 
    formatter.Serialize(stream, data); 
    string test = Convert.ToBase64String(stream.ToArray()); 
    Session["test"] = test; 
}; 

//Deserialize 
using (MemoryStream stream = new MemoryStream(Convert.FromBase64String((string)Session["test"]))) 
{ 
    data = (FormCollection) formatter.Deserialize(stream); 
} 

ich leider diesen Fehler bekam:

System.Runtime.Serialization.SerializationException: Type 'System.Web.Mvc.FormCollection' in Assembly 'System.Web.Mvc, Version=5.2.3.0, Culture=neutral... is not marked as serializable. 

Da dies eine versiegelte Klasse ist, kann ich nicht erweitern Sie es und fügen Sie das Attribut [Serializable] hinzu.

Meine Fragen sind:

  1. Warum kann ich Formcollection wie dies nicht serialisiert werden?

  2. Und wie kann ich ein FormCollection-Objekt serialisieren/deserialisieren?

Antwort

2
  1. Es kann nicht so serialisiert werden, da es [Serializable] Attribut fehlt. Das heißt, Entwickler dieser Klasse hatten nicht die Absicht, sie serialisierbar zu machen (mit BinaryFormatter). Die Tatsache, dass seine Elternklasse ISerializable implementiert und mit [Serializable] markiert ist, ändert nichts - die Kindklasse könnte eigene interne Details haben, die während der Serialisierung verloren gehen, wenn es möglich ist, einen Nachkommen der serialisierbaren Klasse zu serialisieren.

  2. Wenn Sie BinaryFormatter verwenden (was nicht der beste Weg sein könnte oder) - Sie können es wie folgt tun:

    BinaryFormatter formatter = new BinaryFormatter();    
    //Serialize 
    string serialized; 
    using (MemoryStream stream = new MemoryStream()) 
    { 
        // pass FormCollection to constructor of new NameValueCollection 
        // that way we kind of convert it to NameValueCollection which is serializable 
        // of course we lost any FormCollection-specific details (if there were any) 
        formatter.Serialize(stream, new NameValueCollection(data)); 
        serialized = Convert.ToBase64String(stream.ToArray());     
    }; 
    
    //Deserialize 
    using (MemoryStream stream = new MemoryStream(Convert.FromBase64String(serialized))) { 
        // deserialize as NameValueCollection then create new 
        // FormCollection from that 
        data = new FormCollection((NameValueCollection) formatter.Deserialize(stream)); 
    } 
    
+0

Danke, das eine Menge Dinge aufgeklärt! Kannst du dir von deinem Kopf irgendwelche Probleme vorstellen, die BinaryFormatter in diesem Beispiel haben könnte? – WCGPR0

+0

Wenn Sie serialisierte Daten nirgends weitergeben werden, ist es in Ordnung, BinaryFormatter zu verwenden. Beachten Sie jedoch, dass die Formularsammlung theoretisch Objekte enthalten kann, die nicht serialisierbar sind (obwohl dies ungewöhnlich ist). – Evk

Verwandte Themen