0

XMLクラスの逆シリアル化に関して問題が発生しています。XMLはインターフェイスでシリアル化/逆シリアル化されないため、IListにプロキシを使用する必要があります。NHibernateはリストを受け入れず、インターフェースのみを受け入れるため、このプロキシを使用する必要があります。私の問題は、逆シリアル化するときだけです。シリアル化は正常に機能します。

public class EmailCategory
    {
        [XmlAttribute("Id")]
        public virtual long Id { get; set; }
        [XmlAttribute("Name")]
        public virtual string Name { get; set; }
        protected internal virtual IList<EmailBranch> EmailBranches { get; set; }

        [XmlArray("EmailBranches")]
        [XmlArrayItem("EmailBranch", typeof(EmailBranch)]
        public List<EmailBranch> EmailBranchesProxy {
            get { return EmailBranches != null ? EmailBranches .ToList() : null; }
            set { EmailBranches = value; }
        }
    }
4

1 に答える 1

0

DTOオブジェクトはおそらく最もクリーンです。データベースオブジェクトをシリアル化しようとすると、さまざまな問題が発生する可能性があります。ただし、それでもオブジェクトをシリアル化する場合は、次の解決策が考えられます。

public class EmailCategory {[XmlAttribute( "Id")] public virtual long Id {get; セットする; } [XmlAttribute( "Name")] public virtual string Name {get; セットする; }保護された内部仮想IListEmailBranches{get; セットする; }//プライベートリスト_test=new List();

//[XmlArray("EmailBranches")]
//[XmlArrayItem("EmailBranch", typeof(EmailBranch))]
//public virtual List<EmailBranch> EmailBranchesProxy {
//    get { return EmailBranches != null ? EmailBranches.ToList() : null; }
//    set { EmailBranches = value; }
//}

[XmlArray("EmailBranches")]
[XmlArrayItem("EmailBranch", typeof(EmailBranch))]
public virtual List<EmailBranch> EmailBranchesProxy
{
    get 
    {
        var proxy = EmailBranches as List<EmailBranch>;
        if (proxy == null && EmailBranches != null)
        {
            proxy = EmailBranches.ToList();
        }

        return proxy;
    }
    set { EmailBranches = value; }
}

public EmailCategory()
{
    EmailBranches = new List<EmailBranch>();
}

}

あなたが抱えている問題はこの行にあります:get { return EmailBranches != null ? EmailBranches .ToList() : null; }。デシリアライズプロセスはgetメソッドを使用してから、コレクションにアイテムを追加します。nullまたは新しいListオブジェクトを返すため、これは元のコレクションを表していませんEmailBranches。したがって、シリアライザーは新しいオブジェクトを正しく逆シリアル化しEmailBranchますが、間違ったコレクションに追加します。

上記のように、修正EmailBranchesはコンストラクター内でコレクションを初期化し(したがって、nullにはなりません...これはとにかく良い考えです)、プロキシプロパティに適切にタイプチェックすることです。

于 2013-01-09T00:15:26.507 に答える