2010-12-14 10 views
1

オブジェクトをアプリケーション設定にシリアル化しようとしています。私はすでにオブジェクト型に設定されている設定を持っています。ここに私が連載しようとしているクラスがあります。アプリケーションの設定にオブジェクトをシリアル化する必要があるのは、実行時にオブジェクトの型がわからないためです。C#でオブジェクトをアプリケーション設定にシリアル化する

[Serializable] 
[XmlInclude(typeof(TemplateGeneratorPreferences))] 
public class MyPreferences 
{ 
    [XmlElement(ElementName="GeneratorPreferences", Type=typeof(TemplateGeneratorPreferences))] 
    public TemplateGeneratorPreferences FormSpecificPref{ get; set; } 

    public MyPreferences() 
    { 
     GeneratorPreferences = new ScenarioTemplateGeneratorPreferences(); 
    } 
} 

[Serializable] 
public class TemplateGeneratorPreferences 
{ 
    [XmlAttribute("MyBool")] 
    public bool MyBool { get; set; } 

    public ScenarioTemplateGeneratorPreferences() 
    { 
     MyBool = true; 
    } 
} 

これは単純にシリアライズしませんが、私は次の例外を取得:。

」タイプのMyPreferencesが期待されていなかったが、静的に知られていないタイプを指定するには、XmlIncludeまたはSoapInclude 属性を使用します。 "

私はXmlInclude属性を含んでいましたので、私はちょっと困りました。

+0

.NETでXmlシリアル化を使用する場合、 '[Serializable]'を追加する必要はありません。それを使用すると、人々は何かをしたり、必要であると想定したりするので、誤解を招く恐れがあります。 – Cheeso

答えて

1

MSDN(errormessageを検索するときにGoogleにポップアップする最初のリンク)は、その属性で拡張する必要のある基本タイプだと伝えます。 XmlInclude属性を取り付け

[System.Xml.Serialization.XmlInclude(typeof(Derived))] 
public class Base 
{ 
    // ... 
} 

フィールドまたはプロパティが型ベースとしたときのXmlSerializerが派生型のオブジェクトを参照するフィールドをシリアル化することを可能にします。

+0

既にそれを見て(はい私はGoogleを使用する方法を知っている)、私は種類にXmlIncludeを追加することが助けと思った。 XmlIncludeの有無にかかわらず、同じ例外が発生しています。このドキュメントには、この例外を取得するための1つの特定の例しかありません。私はこの例外がトップレベルのクラスを指している、私はそれの中で使用しているタイプの1つではない – Tom

0

シリアル化に使用するコードをアプリの設定に表示できますか?

問題は、定義したタイプの問題ではありません。このように定義されたクラスについては

<MyPreferences 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <GeneratorPreferences MyBool="true" /> 
</MyPreferences> 

public class MyPreferences 
{ 
    [XmlElement(ElementName="GeneratorPreferences")] 
    public TemplateGeneratorPreferences FormSpecificPref { get; set; } 

    public MyPreferences() 
    { 
     FormSpecificPref = new TemplateGeneratorPreferences(); 
    } 
} 

public class TemplateGeneratorPreferences 
{ 
    [XmlAttribute("MyBool")] 
    public bool MyBool { get; set; } 

    public TemplateGeneratorPreferences() 
    { 
     MyBool = true; 
    } 
} 

と、このようなシリアル化コード:

var m = new MyPreferences(); 
    var s1 = new XmlSerializer(typeof(MyPreferences)); 
    s1.Serialize(Console.Out, m); 

注:あなたが必要としない、私はそれを行うとき、私は成功したシリアル化を取得します[Serializable] Xmlシリアライザで実行されるクラスの属性。

関連する問題