0

プログラミングで複数のXmlArrayItemを逆シリアル化しようとしているときに、かなり致命的な問題が発生しました。

XMLは基本的に次のようになります。

<Root2>
   <Data2>
     <HOLD>
      ...
     </HOLD>
     <CUST_HOLD>
      ...
     </CUST_HOLD>
   </DATA2>
</ROOT2>

そして、このような私のシリアル化可能なコード:

[Serializable()]
[System.Xml.Serialization.XmlRoot("Root2")]
public class Root2
{
    [System.Xml.Serialization.XmlArray("Data2")]           
    [System.Xml.Serialization.XmlArrayItem("CUST_HOLD", typeof(CUST_HOLD))]
    public CUST_HOLD[] CUST_HOLD { get; set; }
    [System.Xml.Serialization.XmlArrayItem("HOLD", typeof(HOLD))]
    public HOLD[] HOLD { get; set; }    

}

別の構成を試しましたが、エラーが発生しないのはこれだけです。ただし、問題は、最初のXmlArrayItem(この場合はCUST_HOLD)のみが処理されることです。もう一方はnullのままですが、対応する配列内に少なくとも1つの項目が存在する必要があります。

4

2 に答える 2

0

で試してみてください

コード

クラス宣言

[Serializable()]
[System.Xml.Serialization.XmlInclude(typeof(CUST_HOLD))]
[System.Xml.Serialization.XmlInclude(typeof(HOLD))]
[System.Xml.Serialization.XmlType(TypeName = "Data2")]
public class Root2
{

    [System.Xml.Serialization.XmlArrayItem("CUST_HOLD")]
    public CUST_HOLD[] CUST_HOLD;


     [System.Xml.Serialization.XmlArrayItem("HOLD")]
    public HOLD[] HOLD;

}

 [Serializable()]
[System.Xml.Serialization.XmlType("CUST_HOLD")]
public class CUST_HOLD
{

    public int i;
}

[Serializable()]
[System.Xml.Serialization.XmlType("HOLD")]
public class HOLD
{

    public int i;
}

シリアル化

List<Root2> list = new List<Root2>();
Root2 obj = new Root2();
obj.CUST_HOLD = new CUST_HOLD[] { new CUST_HOLD() { i = 1 }, new CUST_HOLD() { i = 1 }, new CUST_HOLD() { i = 1 } };
obj.HOLD = new HOLD[] { new HOLD() { i = 1 }, new HOLD() { i = 1 }, new HOLD() { i = 1 } };

  list.Add(obj);

 //Serialize List<Root2>
 System.Xml.Serialization.XmlSerializer Serializer = new     System.Xml.Serialization.XmlSerializer(typeof(List<Root2>),new System.Xml.Serialization.XmlRootAttribute("Root2"));

 System.IO.MemoryStream mo = new System.IO.MemoryStream();
 Serializer.Serialize(mo, list);
 string str = UnicodeEncoding.UTF8.GetString(mo.ToArray());

出力:

<?xml version="1.0"?>
<Root2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Data2>
<CUST_HOLD>
  <CUST_HOLD>
    <i>1</i>
  </CUST_HOLD>
  <CUST_HOLD>
    <i>1</i>
  </CUST_HOLD>
  <CUST_HOLD>
    <i>1</i>
  </CUST_HOLD>
</CUST_HOLD>
<HOLD>
  <HOLD>
    <i>1</i>
  </HOLD>
  <HOLD>
    <i>1</i>
  </HOLD>
  <HOLD>
    <i>1</i>
  </HOLD>
</HOLD>
</Data2>
</Root2>

DeSerialization

string str = @"<?xml version='1.0'?>
<Root2 xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'  xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
<Data2>
<CUST_HOLD>
  <CUST_HOLD>
    <i>1</i>
  </CUST_HOLD>
  <CUST_HOLD>
    <i>1</i>
  </CUST_HOLD>
  <CUST_HOLD>
    <i>1</i>
  </CUST_HOLD>
</CUST_HOLD>
<HOLD>
  <HOLD>
    <i>1</i>
  </HOLD>
  <HOLD>
    <i>1</i>
  </HOLD>
  <HOLD>
    <i>1</i>
  </HOLD>
</HOLD>
</Data2>
</Root2>";

System.Xml.Serialization.XmlSerializer Serializer = new System.Xml.Serialization.XmlSerializer(typeof(List<Root2>), new System.Xml.Serialization.XmlRootAttribute("Root2"));

System.IO.MemoryStream mo = new   System.IO.MemoryStream(UnicodeEncoding.UTF8.GetBytes(str));

List<Root2> list = (List<Root2>)Serializer .Deserialize(mo);

<Data2>タグは、シリアル化タイプがList<Root2>単一Root2インスタンス用である場合にのみ表示されます。<Data2>タグはxml文字列に表示されず、逆シリアル化は実行できません。CUST_HOLDデシリアライズは&に対してnull値を返しますHOLD。戻りタイプは。である必要がありますList<Root2>

于 2012-09-24T17:47:25.570 に答える
0

そのための xsd を作成できない場合は、それを xml としてシリアライズ/デシリアライズすることはできません。

それは、xsd 内のシーケンスまたは非常に貧弱なコレクションになります。

于 2012-09-24T16:10:39.237 に答える