4

xml ファイルをデシリアライズしてドメイン クラスをロードしようとしています。そこで、ドメイン クラスで System.Collections.Generic.List を使用しました。しかし、Session オブジェクトを使用してオブジェクトを保存しようとすると、「タイプ 'NHibernate.Collection.Generic.PersistentGenericBag 1[MyFirstMapTest.Class5]' to type 'System.Collections.Generic.List1[MyFirstMapTest.Class5]' のオブジェクトをキャストできません」という例外で失敗します。この問題は以前のディスカッションの一部に投稿されており、その答えは List の代わりに IList を使用することでした (タイプ NHibernate.Collection.Generic.PersistentGenericBag のオブジェクトを List にキャストできません) 。

しかし、IList を使用すると、xml を Domain クラスに逆シリアル化できません。

XmlTextReader xtr = new XmlTextReader(@"C:\Temp\SampleInput.xml");
XmlSerializer serializer = new XmlSerializer(objClass5.GetType());
objClass5 = (MyFirstMapTest.Class5)serializer.Deserialize(xtr);
session.Save(objClass5);

以下のエラーをスローしています。「タイプ System.Collections.Generic.IList`1[[xxxxxxxxx, Examples, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] のメンバー xxxxx をシリアル化できません。これはインターフェイスであるためです。」

List の代わりに PersistentGenericBag を使用しようとしましたが、PersistentGenericBag はシリアル化できません。したがって、デシリアライゼーションは機能していません。

この問題を解決するにはどうすればよいですか? この問題を見ていただきありがとうございます。

4

2 に答える 2

1

NHibernte バインディングにバッキング フィールドを使用し、シリアライゼーションにプロパティを使用することができます。バッキング フィールド - IList の場合、プロパティは List 型になります。

流暢なマッピングを編集
すると、次のようになります。

public class HierarchyLevelMap : IAutoMappingOverride<HierarchyLevel>
{
    public void Override(AutoMapping<HierarchyLevel> mapping)
    {
        mapping.HasMany(x => x.StructuralUnits)
            .Access.ReadOnlyPropertyThroughCamelCaseField();
    }
}

実在物:

public class HierarchyLevel : IEntity
{
    private readonly IList<StructuralUnit> structuralUnits = new List<StructuralUnit>();

    public virtual List<StructuralUnit> StructuralUnits
    {
        get { return structuralUnits; }
        set { structuralUnits = value; }
    }
}
于 2013-05-20T07:06:51.980 に答える