2017-06-07 12 views
1

FormCollectionオブジェクトをシリアル化しようとしていて、調査した内容に基づいてNameObjectCollectionBaseを継承し、GetObjectDataとISerializableも継承します。シリアライズ可能なのではないでしょうか?FormCollectionを直列化および逆シリアル化する方法は?

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

ここで私がしようとしているものの抜粋です:

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); 
} 

私は、残念ながら、このエラーを得た:

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. 

これはシールクラスですので、私はできませんそれを拡張し、[Serializable]属性を追加してください。

私の質問は以下のとおりです。

  1. 私はこのようなFormCollectionをシリアル化できないのはなぜ?

  2. そして、私はFormCollectionオブジェクトをシリアル化/逆シリアル化できますか?

答えて

2
  1. それは[Serializable]属性が欠けているので、それは次のようにシリアライズすることはできません。これは、このクラスの開発者が(BinaryFormatterで)シリアライズ可能にする意図がないことを意味します。親クラスがISerializableを実装しており、[Serializable]とマークされているという事実は何も変更されません。子クラスは、シリアル化可能なクラスの子孫を直列化することが許されていれば、

  2. あなたが(または最良の方法ではないかもしれない可能性があります)BinaryFormatterを使用する場合 - あなたはこのようにそれを行うことができます。

    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

が、これは多くのことを片付け、ありがとうございます!あなたの頭の上から、この例でBinaryFormatterが持つ潜在的な問題を考えることができますか? – WCGPR0

+0

シリアル化されたデータをどこにも渡すつもりがない場合は、BinaryFormatterを使用しても問題ないと思います。しかし、フォームコレクションには、理論上、直列化できないオブジェクトが含まれることがある(ただしこれはあまり一般的ではありません)。 – Evk

関連する問題