C# での XML シリアル化
-
09-06-2019 - |
質問
インターフェイスを明示的に実装する単純な型があります。
public interface IMessageHeader
{
string FromAddress { get; set; }
string ToAddress { get; set; }
}
[Serializable]
public class MessageHeader:IMessageHeader
{
private string from;
private string to;
[XmlAttribute("From")]
string IMessageHeade.FromAddress
{
get { return this.from;}
set { this.from = value;}
}
[XmlAttribute("To")]
string IMessageHeade.ToAddress
{
get { return this.to;}
set { this.to = value;}
}
}
IMessageHeader 型のオブジェクトをシリアル化および逆シリアル化する方法はありますか?
試してみると次のエラーが発生しました
「インターフェイス IMessageHeader をシリアル化できません」
解決
Activator.CreateInstance(typeof(IMessageHeader)) を実行できないため、IMessageHeader をシリアル化できません。これは、シリアル化が内部で実行されることです。具体的な型が必要です。
typeof(MessageHeader) を実行することも、MessageHeader のインスタンスを用意して実行することもできます。
XmlSerializer serializer = new XmlSerializer(instance.GetType())
他のヒント
いいえ、シリアライザーにはインスタンス化できる具体的なクラスが必要であるためです。
次のコードがあるとします。
XmlSerializer ser = new XmlSerializer(typeof(IMessageHeader));
IMessageHeader header = (IMessageHeader)ser.Deserialize(data);
シリアライザーは Deserialize() から返すためにどのクラスを作成しますか?
理論的には、XmlSerializer を使用しない限り、インターフェイスのシリアル化/逆シリアル化は可能です。
IXmlSerializable を IMessageHeader 宣言に追加してみてください。ただし、うまくいかないと思います。
私の記憶によると、.net xml シリアライザーは、デフォルトのコンストラクターを持つ具象クラスに対してのみ機能します。
この問題は、インターフェイスを逆シリアル化できないが、具体的なクラスをインスタンス化する必要があるという事実に起因します。
XmlInclude 属性を使用すると、どの具体的なクラスがインターフェイスを実装するかをシリアライザーに伝えることができます。
IMessageHeader を実装し、MarshalByRefObject も継承する抽象基本クラスを作成できます。