XmlSerializerを使用してカスタムクラスをデシリアライズしようとしていて、いくつかの問題があります。デシリアライズしようとしている型がわからないこととプラグイン可能ですそれを判断するのが難しい。C#カスタムXmlシリアル化
私はthis postに似ていますが、XmlSerializableのインターフェイスを非直列化する必要があるため、私のアプローチではうまく動作しません。
私が現在入手しているのは、フォームのものです。プラグインを介して実装されるクラスAとクラスBの両方を処理できることを期待し、必要とすることに注意してください。ですから、私がIXmlSerializableを使用することを避けることができれば、それは素晴らしいことでしょう。
ReadXml for Aは、私が立ち往生しているものです。しかし、システムを改善するために私ができる他の変更があるなら、私はそうすることを喜んでします。
public class A : IXmlSerializable
{
public IB MyB { get; set;}
public void ReadXml(System.Xml.XmlReader reader)
{
// deserialize other member attributes
SeekElement(reader, "MyB");
string typeName = reader.GetAttribute("Type");
// Somehow need to the type based on the typename. From potentially
//an external assembly. Is it possible to use the extra types passed
//into an XMlSerializer Constructor???
Type bType = ???
// Somehow then need to deserialize B's Members
// Deserialize X
// Deserialize Y
}
public void WriteXml(System.Xml.XmlWriter writer)
{
// serialize other members as attributes
writer.WriteStartElement("MyB");
writer.WriteAttributeString("Type", this.MyB.GetType().ToString());
this.MyB.WriteXml(writer);
writer.WriteEndElement();
}
private void SeekElement(XmlReader reader, string elementName)
{
ReaderToNextNode(reader);
while (reader.Name != elementName)
{
ReaderToNextNode(reader);
}
}
private void ReaderToNextNode(XmlReader reader)
{
reader.Read();
while (reader.NodeType == XmlNodeType.Whitespace)
{
reader.Read();
}
}
}
public interface IB : IXmlSerializable
{
}
public class B : IB
{
public void ReadXml(XmlReader reader)
{
this.X = Convert.ToDouble(reader.GetAttribute("x"));
this.Y = Convert.ToDouble(reader.GetAttribute("y"));
}
public void WriteXml(XmlWriter writer)
{
writer.WriteAttributeString("x", this.X.ToString());
writer.WriteAttributeString("y", this.Y.ToString());
}
}
注:BがインターフェイスIBを使用すると考えられていたように更新されました。少し間違った質問を申し訳ありません。
これは興味深いアプローチです。だから、その時点であなたの提案は、その作成された型のReadXml()を呼び出してメンバを初期化しますか?それは、私が型を取得して、おそらく外部の型の1つを私のライブラリに作ることができるかどうかによって機能するかもしれません。 – Ian
私はあなたのコメントに "私は何とか型名に基づいた型が必要です"と答えた。 –
ありがとうジョン。 XMLから型を読み込んでインスタンスを作成することで、作成したインスタンスのReadXmlメソッドを使用してインスタンスを直列化解除することができました。私のインターフェイスでうまく動作します。 – Ian