2017-09-04 7 views
1

私は任意の長さの型と値のペアのリストを必要とするクラスを持っています。シリアライズ型と値の組C#

たとえば、{(文字列、 "hello")、(int、3)}を保持するインスタンスと、{(char、 'a')}を保持するインスタンスがあります。型はこれまでのところ型になりますが、intとstringだけに制限できますが、柔軟性を保つためにfloat、charなどを含めることが可能です。

このクラスのインスタンスを直列化および逆シリアル化する必要があります。私の優先シリアル化は、System.Xml.Serialization.XmlSerializerを使用したXMLです。どちらのタプルやオブジェクトは、デフォルトでシリアル化しているため

Tuple<Type, object> 

には良かったので、私は、カスタム構造体定義された:

[Serializable] 
public struct ObjectDataItem { public Type Type; public string Value; } 

をし、私のクラスは、(私が推測として、文字列値のために大丈夫だったObjectDataItemsのリストを保持していますとにかくどこかの型変換は不可避です)。

私の質問は、私がObjectDataItemを逆シリアル化する方法です(特に 'タイプ'変数をデシリアライズします)。

私は、現在のコードを使用してデシリアライズしています

public static M LoadXML<M>(string fileName) where M : struct 
    { 
     if (File.Exists(fileName)) 
     { 
      FileStream loadStream = new FileStream(fileName, FileMode.Open); 
      XmlSerializer serializer = new XmlSerializer(typeof(M)); 
      M fileLoaded = (M)serializer.Deserialize(loadStream); 
      loadStream.Close(); 
      return fileLoaded; 
     } 
     else throw new HException("File not found: {0}", fileName); 
    } 
+1

は[ハウツー-XMLシリアル化-型]の重複のように見えるようにあなたのDataObjectItem意志が見えます(https://stackoverflow.com/questions/290867/how-to -xml-serialize-a-type) – ASpirin

答えて

1

あなたが唯一のタイプ名を保存して、あなたのValueフィールドを作成する場合は

new ObjectDataItem { TypeName = typeof(int).FullName, Value = 3.ToString() } 
... 
public struct ObjectDataItem 
{ 
    public string TypeName; 
    public string Value; 

    [XmlIgnore] 
    public Type RealType 
    { 
     get 
     { 
      return Type.GetType(TypeName); 
     } 
    } 
} 

シリアライズ後またはプロパティ自体にそれを復元することができますobjectシリアライザは、型をXMLに格納し、正しい型を逆シリアル化に入れます。

<Value xsi:type="xsd:int">3</Value>

public struct ObjectDataItem 
{ 
    public object Value; 

    [XmlIgnore] 
    public Type Type 
    { 
     get 
     { 
      return Value.GetType(); 
     } 
    } 
} 
+0

基本的には、オブジェクトをシリアル化する機会が与えられていれば、C#はこれを自動的に処理すると言っています。私は今夜​​それを試し、それが機能すればこれを解決策としてマークします。ジェネリックソリューションもここでも使えますか?例えばObjectDataItem {public T Value; }、シリアル化中にValueはオブジェクトにキャストされ(型情報が文字列として保存されることを意味します)、逆シリアル化中に文字列をTypeに変換してジェネリック型引数を提供し、オブジェクトをキャストします – Haighstrom

+0

これは、さまざまな種類のジェネリックのコレクションを目立たせるのは難しいでしょう。 – ASpirin

+0

ありがとうございます。私はオブジェクトとXmlIgnore Typeバリエーションを使いました。 – Haighstrom

関連する問題