2

建物オブジェクトでいっぱいのリストがあり、それを XML ファイルにシリアル化する必要があります。基本的なシリアル化は正常に機能していますが、読みやすくするために値を属性に変換すると、int 値以外のすべてで奇妙に失敗します。

シリアル化する必要がある私が使用している建物クラスは次のとおりです。

    public class building
    {
       [XmlAttribute]
       public string strName { set; get; }    //name
       [XmlAttribute]
       public int intCount { set; get; }      //count of building
       [XmlAttribute]
       public int intCost { set; get; }       //running cost of building
       [XmlAttribute]
       public string strProd { set; get; }    //product
       [XmlAttribute)]
       public string strRes1 { set; get; }    //first ressource required
       [XmlAttribute]
       public string strRes2 { set; get; }    //second ressource required
       [XmlAttribute]
       public int intTime { set; get; }       //time to build in seconds
    }

[XMLAttribute] タグを省略した場合、XML ファイル出力は次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfBuilding xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <building>
    <strName>Holzfäller</strName>
    <strKind>Produktion</strKind>
    <intCost>2</intCost>
    <strProd>Holz</strProd>
    <strRes1 />
    <strRes2 />
    <intTime>105</intTime>
  </building>

ファイルに 50 をはるかに超える建物があるため、全体像を把握するのは困難です。上記のコードで作成された XML ファイルは次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfBuilding xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <building intCount="0" intCost="0" intTime="0" />
  <building intCount="0" intCost="0" intTime="0" />

ご覧のとおり、int 値のみが追加され、それらも FALSE です。すべての値がゼロに設定されます。奇妙なことに、リストを作成した後にプログラムで 1 つの値を更新すると、その変更が XML にも反映されます。ベース値だけが無視されるか、ゼロに変更されるようです。

編集:私はまた、次のように DataType を設定しようとしました:

[XmlAttribute(DataType = "string")]

しかし、これは文字列を馬鹿にするだけで、まったく表示されません。

ちょっとこれで負けました。属性をそのままにしておくと、すべてが正常に機能するため、少なくともコードの残りの部分が問題を引き起こしていないことを確信しています。しかし、XMLSerializer が文字列であるオブジェクト属性を無視し、すべての int 値をリセットするのはなぜでしょうか? どうすればこれを変更できますか?

これが他の場所で尋ねられた場合は申し訳ありませんが、Google が私の問題を解決するための適切な言葉を見つけることができません。主な理由は、ここで何が起こっているのか理解できず、どこから始めればよいのかわからないからです。私が見つけたドキュメンテーションは、私が何をしているかを単に示しており、それが機能すると主張しています。しかし、明らかにそうではありません:-(

4

1 に答える 1

2

あなたstringの s は null であるため、シリアライゼーションで書き込まれません。

文字列フィールドをstring.Emptyinbuildingのデフォルト コンストラクターに初期化すると、出力に表示されます。

私はこのコンストラクタでそれをテストしましたbuilding:

public building()
{
    strProd = "";
}

出力:

<?xml version="1.0" encoding="utf-16"?>
<ArrayOfBuilding xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <building intCount="0" intCost="0" strProd="" intTime="0" />
  <building intCount="0" intCost="0" strProd="" intTime="0" />
</ArrayOfBuilding>

属性によって動作が異なるのはなぜですか?

Xml では、コンテンツを省略して要素に null 許容型を表示できます。ただし、属性は nullable を表示できず、空の文字列区別できません。したがって、属性は完全に省略されます。

于 2013-10-22T08:32:14.067 に答える