XML-Serializable クラスにパラメータなしのコンストラクタが必要な理由 質問する

XML-Serializable クラスにパラメータなしのコンストラクタが必要な理由 質問する

XML シリアル化を行うコードを書いています。以下の関数を使用します。

public static string SerializeToXml(object obj)
{
    XmlSerializer serializer = new XmlSerializer(obj.GetType());
    using (StringWriter writer = new StringWriter())
    {
        serializer.Serialize(writer, obj);
        return writer.ToString();
    }
}

引数がパラメータなしのコンストラクターを持たないクラスのインスタンスである場合、例外がスローされます。

ハンドルされない例外: System.InvalidOperationException: CSharpConsole.Foo は、パラメータなしのコンストラクタがないためシリアル化できません。 at System.Xml.Serialization.TypeDesc.CheckSupported() at System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo sourc e, Boolean directReference, Boolean throwOnError) at System.Xml.Serialization.ModelScope.GetTypeModel(Type type, Boolean direct Reference) at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type type , XmlRootAttribute root, String defaultNamespace) at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultName space) at System.Xml.Serialization.XmlSerializer..ctor(Type type)

XML シリアル化を成功させるには、なぜパラメーターなしのコンストラクターが必要なのでしょうか?

編集: cfeduke さんの回答に感謝します。パラメータなしのコンストラクタは、プライベートまたは内部にすることができます。

ベストアンサー1

オブジェクトのデシリアル化中、オブジェクトのデシリアル化を担当するクラスはシリアル化されたクラスのインスタンスを作成し、設定するインスタンスを取得した後にのみ、シリアル化されたフィールドとプロパティの設定を続行します。

必要に応じて、パラメータがない限り、コンストラクターを作成することもできますprivateinternal

おすすめ記事