0

クラスにデシリアライズしたい次のxmlがあります

<?xml version="1.0" encoding="utf-8" ?>
<root>
  <element1>String1</element1>
  <element2>String2</element2>
</root>

私はそれを次のクラスにシリアル化しようとしています:

    [XmlRoot("root")]
    public class root
    {
        [XmlElement("element1")]
        internal string element1 { get; set; }

        [XmlElement("element2")]
        internal string element2 { get; set; }
    }

次のコードを使用して逆シリアル化しようとすると、configオブジェクトがインスタンス化されますが、文字列はnullです。

     using (TextReader reader = new StreamReader(configFile))
        {
            XmlSerializer serializer = new XmlSerializer(typeof(root));
            this.config = (root)serializer.Deserialize(reader);
        }

xsd.exeを使用してxsdを作成し、それに基づいてクラスを作成しようとしましたが、そのツールによって生成されるクラッターが多すぎます。私はここに近いと思います。私は何が欠けていますか?

4

4 に答える 4

7

内部プロパティをシリアル化/逆シリアル化することはできません-それらはパブリックである必要があります。

于 2008-11-06T23:46:31.747 に答える
5

私はあなたの問題の性質に関してブロディに同意します。ただし、これらのフィールドを公開することに反対する場合があります。私が過去にこの問題を処理した方法は、.xmlの読み取り/書き込みのみを目的とし、そのすべてのフィールドをパブリックにするシリアル化可能なクラスを作成することです。次に、外部インターフェイスである新しいクラスを作成します。コンストラクターの引数としてシリアライズ可能なクラスを取り、外部クラスはシリアライズ可能なクラスへのアクセスを制御するパブリックプロパティを提供します。

于 2008-11-06T23:51:26.837 に答える
1

XSD.exeを使用して、XSD(XMLスキーマ定義)からクラスを生成できます。これにより、関連するXMLをシリアル化および逆シリアル化できる使用可能なクラス構造が生成されます。

于 2008-11-13T01:22:40.053 に答える
1

私の実装をフォローアップするには... XmlSerializer クラスを一緒に使用することを断念しました。私がデシリアライズしていたクラスは非常に複雑で、シリアライズが必要な他のオブジェクトのリストが含まれていました。クラスに追加しなければならなかった属性の量により、コードが悪臭を放ちました

結局、Linq to XML を使用して逆シリアル化を行いました....クラスの宣言の複雑さは減りましたが、linq ステートメントはかなり複雑になりました。

やり直すならWCFとデータコントラクトのシリアライザを考えたかも…。それも難しかったかもしれません。

最近、人々がどのように xml ドキュメントをオブジェクトにデシリアライズしているのか興味があります。Linq ステートメントについて頭を悩ませた後、これが進むべき道かもしれないと思います。オブジェクトは作成がはるかに簡単で、パブリックである必要はありません。また、XmlSerializer は「古い学校」のようですが、Linq to XML はより「新しい学校」です。

他の人の意見を聞きたいです。

于 2008-11-10T19:50:31.393 に答える