2012-01-31 3 views
1

文字列をC#タイプに変換したいと思います。ここでのユースケースは、シリアライズされたデータをタイプとともにキャッシュに格納してからキャストして戻すことです。 DataEntities.Showという名前のカスタムクラスがあります(DataEntitiesは名前空間です)。 "DataEntities.ShowEntity"と入力してデシリアライズしようとすると、すべてがうまくやっています。C#を構築する最良の方法シリアル化/逆シリアル化のための文字列を入力してください

キャッシュにList型のオブジェクトを格納するときに問題が発生します。 結果の型が "System.Collections.Generic.List`1 [DataEntities.ShowEntity]"であるため、アセンブリにはDataEntities.ShowEntityのみが含まれており、結果の型が見つからないため、以下の検索が失敗します。私は結果としてヌルを得る。

"List"または "Enumeration"という接頭辞の文字列型を解析するという醜い解決策が考えられますが、より洗練された方法が必要です。何かアドバイス?

private static Type GetGlobalType(string s) 
    { 
     Type t = null; 
     Assembly[] av = AppDomain.CurrentDomain.GetAssemblies(); 
     foreach (Assembly a in av) 
     { 
      Type[] types = a.GetTypes(); 
      t = Type.GetType(s + "," + a.GetName()); 
      if (t == null) 
      { 
        t = Type.GetType(s); 
      } 

      if (t != null) 
        break; 
     } 
     return t; 
    } 
+3

JSONまたはXMLをまったく使用できますか?どちらの方法でも、bostのシリアライゼーションとデシリアライゼーションに組み込みのC#メソッドを使用できます。 – Tjaart

+0

[ServiceStack.Text](https://github.com/ServiceStack/ServiceStack.Text)を試しましたか? –

答えて

0

あなた自身でキャスティングを扱う特別な理由は何ですか?暗黙の宣言を使用すると、単純なXMLシリアル化を使用してこれを処理できます。

クラスを直列化解除すると、実行時に自動的に正しい型が設定されます。キャストする必要はありません。

 var dataIn = new List<DataEntities.ShowEntity>();    
     Console.WriteLine("Type before serialization: " + dataIn.GetType()); 

     var xs = new XmlSerializer(dataIn.GetType());    
     var xmlWriter = XmlWriter.Create(@"C:\test.xml"); 
     xs.Serialize(xmlWriter, dataIn); 
     xmlWriter.Close(); 

     var xmlReader = XmlReader.Create(@"C:\test.xml"); 
     var dataOut = xs.Deserialize(xmlReader); 
     xmlReader.Close(); 

     Console.WriteLine("Type after deserialization: " + dataOut.GetType());  
関連する問題