2

私はこのようなxmlを作成しようとしています:

<CreditApplication>
    <ApplicantData>
        <FirstName> John </FirstName>
        <LastName> Smith </LastName>
    </ApplicantData>
    <CoApplicantData>
        <FirstName> Mary </FirstName>
        <LastName> Jane </LastName>
    </CoApplicantData>
</CreditApplication>

そして、クラスを次のように定義しました。

[XmlRoot("CreditApplication")]
public class CreditApplication
{
    [XmlElement("ApplicantData")]
    public CreditApplicant Applicant;
    [XmlElement("CoApplicantData")]
    public CreditApplicant CoApplicant;
}

public class CreditApplicant : INotifyPropertyChanged
{
    ...
    [XmlElement("FirstName")]
    public string FirstName { set; get; }
    [XmlElement("LastName")]
    public string LastName { set; get; }
    ...
}

また、CreditApplication クラスのさらに下には、プログラムの別の場所で定義されている列挙型への参照があり、これもシリアライズ可能にする必要があります。

実際にプログラムを実行し、クラスをserlizeしようとすると、次のようになります。

XmlSerializer applicantXMLSerializer = new XmlSerializer(typeof(CreditApplication));
StringWriter applicantStringWriter = new StringWriter();
XmlWriter applicantXmlWriter = XmlWriter.Create(applicantStringWriter);
applicantXMLSerializer.Serialize(applicantXmlWriter, application);
var applicantXML = applicantStringWriter.ToString();

しかし、私はエラーが発生します:There was an error reflecting type 'Models.Credit.CreditApplication'

誰かが私が間違っていることを知っていますか?

編集:

提案された変更を反映するために、上記のコードを更新しました。ただし、他にも問題が発生しています。

私はそのように定義された列挙型を持っています:

[DataContract]
public enum Relationship
{
    Spouse = 4,
    ResidesWith = 1,
    Parent = 2,
    Other = 3,
    PersonalGuarantor = 5,
    CoApplicant = 6
}

上記のように、ゼロは定義されたオプションではありません。このため、デフォルト値はありません。私は、設定されていない関係はデフォルトでゼロになるという考えに基づいてプログラムを設計しました。そうすれば、値が設定されているかどうかを簡単に確認できます。ゼロを定義してから「関係なし」などに初期化した場合、ユーザーが値を「関係なし」に設定したのか、単にオプションを選択しなかったのかを知る方法はありません。

移動:

デフォルト値のない列挙型の XML シリアル化

4

1 に答える 1

2

フィールドが XML 内の個別の要素であると想定される場合は、 XMLAttribute属性の代わりにXMLElement 属性を使用します。

例えば:

<SimpleXML name="test">
  <child>SomeValue</child>
</SimpleXML>

nameは属性ですが、childは要素です。

于 2012-06-11T18:26:41.027 に答える