1. ホーム
  2. c#

[解決済み] XMLシリアライズ可能なクラスがパラメータなしのコンストラクタを必要とする理由

2022-05-01 22:26:08

質問

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はシリアライズできません。 を持たないので パラメータレスコンストラクタ System.Xml.Serialization.TypeDesc.CheckSupported()を実行する。 で System.Xml.Serialization.TypeScope.GetTypeDesc(タイプ type, MemberInfo source e, Boolean directReference, Boolean throwOnError) で System.Xml.Serialization.ModelScope.GetTypeModel(タイプ type, Boolean direct Reference) at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(タイプ タイプ , XmlRootAttribute ルート, String defaultNamespace) at System.Xml.Serialization.XmlSerializer.ctor(Type type, String defaultName space) at System.Xml.Serialization.XmlSerializer.ctor(Type) タイプ)

xmlシリアライズを成功させるために、なぜパラメータなしのコンストラクタが必要なのですか?

EDIT: cfedukeさんの回答ありがとうございます。パラメータレスコンストラクタは、プライベートでも内部でも構いません。

どのように解決するのですか?

オブジェクトのデシリアライズの際、デシリアライズを担当するクラスは、シリアライズされたクラスのインスタンスを作成し、入力するインスタンスを取得してからシリアライズされたフィールドとプロパティに入力を進めます。

コンストラクタを private または internal というように、パラメータレスで記述します。