問題
xmlを逆シリアル化するときに問題が発生し、子要素の1つが逆シリアル化されていません。xmlに入力されているにもかかわらず、クラスインスタンスではnullです。
少し背景
XsdObjectGeneratorを使用して、.xsdに基づいてpocoクラスを作成しました。その後、xmlをクラスインスタンスに逆シリアル化し、オブジェクトを操作することができました。
自動生成されたクラスを「TFS」という名前空間でラップして変更しました。
プロジェクトのある時点で、子要素の1つを「COM」と呼ばれる独自の名前空間に配置する必要があることがわかりました。
次にxmlをクラスインスタンスに逆シリアル化しようとしたとき、子要素は逆シリアル化されていません。
これは、子要素の名前空間がCOMに変更されたTFSクラスコードの適切なスニペットです。また、TFS名前空間に残る親要素OrdDtlも含まれます。
[XmlRoot(ElementName="OrdDtl",Namespace=Declarations.SchemaVersion,IsNullable=false),Serializable]
public class OrdDtl
{
[XmlElement(Type=typeof(COM.AcctSetup), ElementName="AcctSetup", IsNullable=false, Form=XmlSchemaForm.Qualified, Namespace = Declarations.SchemaVersion)]
[EditorBrowsable(EditorBrowsableState.Advanced)]
public COM.AcctSetup __AcctSetup;
[XmlIgnore]
public COM.AcctSetup AcctSetup
{
get
{
if (__AcctSetup == null) __AcctSetup = new COM.AcctSetup();
return __AcctSetup;
}
set {__AcctSetup = value;}
}
独自のファイルに含まれているCOM名前空間のAcctSetup宣言は次のとおりです。
[XmlRoot(ElementName = "AcctSetup", Namespace = Declarations.SchemaVersion, IsNullable = false), Serializable]
public class AcctSetup
{
......
}
これが私の逆シリアル化関数です:
public static T XMLStringToXMLObject<T>(string pXmlString)
{
T retVal = default(T);
try
{
XmlSerializer vSerializer = new XmlSerializer(typeof(T));
MemoryStream vMemoryStream = new MemoryStream(StringToUTF8ByteArray(pXmlString));
XmlTextWriter vXmlTextWriter = new XmlTextWriter(vMemoryStream, Encoding.UTF8);
retVal = (T)vSerializer.Deserialize(vMemoryStream);
}
catch (System.Exception ex)
{
if (ExceptionMain.LogException(ex))
throw;
}
return retVal;
}
COM.AcctSetup要素を逆シリアル化するための支援をいただければ幸いです。追加の情報やコードサンプルが必要な場合はお知らせください。