1

次のようなオブジェクト構造があります。

[DataContract]
public abstract class Condition<T>
{
    [DataMember] public string Id { get; set; }
}

[DataContract(Name = "AttributeEqualTo", Namespace = "")]
public class AttributeEqualTo<T> : Condition<T>
{
    [DataMember] public string AttributeName { get; set; }
    [DataMember] public string ExpectedValue { get; set; }
}

[DataContract(Name = "AttributeNotEqualTo", Namespace = "")]
public class AttributeNotEqualTo<T> : AttributeEqualTo<T>
{
}

[CollectionDataContract(Name = "Conditions", Namespace = "")]
[KnownType("KnownTypes")]
public class ConditionSet<T> : Collection<Condition<T>>
{
    public static IEnumerable<Type> KnownTypes()
    {
        var knownTypes = new Collection<Type>
                             {
                                 typeof(AttributeEqualTo<T>),
                                 typeof(AttributeNotEqualTo<T>),
                             };
        return knownTypes;
    }
}

次の XML があるとします。

  <Conditions>
    <AttributeEqualTo>
      <Id>C1</Id>
      <AttributeName>Foo</AttributeName>
      <ExpectedValue>Bar</ExpectedValue>
    </AttributeEqualTo>
    <AttributeNotEqualTo>
      <Id>C2</Id>
      <AttributeName>Blah</AttributeName>
      <ExpectedValue>Value</ExpectedValue>
    </AttributeNotEqualTo>
  </Conditions>

それを逆シリアル化すると、XML で定義された 2 つのそれぞれを含む条件のコレクションを取得できると期待していました。私が抱えている問題は、コレクションを取得することですが、空です。

条件を個別に逆シリアル化する機能をテストしましたが、正常に動作しているようです。

コントラクトの定義方法の参考として、Data Contract Known Typesを使用していました。

4

1 に答える 1

0

ジェネリックを削除してみてください。これにより、シリアライゼーションが壊れることがよくあります。

于 2014-12-16T05:34:32.063 に答える