【问题标题】:How to serialize IList<T> field without to generate complex AssemblyQualifiedName?如何序列化 IList<T> 字段而不生成复杂的 AssemblyQualifiedName?
【发布时间】:2017-05-11 04:13:30
【问题描述】:

我有一个项目要使用 WCF DataContractSerialize 进行序列化。 在类中序列化字段public IList&lt;Simple&gt; List2;时,总是生成到

<a:List2 z:Id="536" i:type="b:System.Collections.Generic.List`1[[SerializationTypes.Simple, Serialization.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9d77cc7ad89668eb]]" z:Size="2" >
  <c:Simple z:Ref="525" i:nil="true"/>
  <c:Simple z:Ref="534" i:nil="true"/>
</a:List2>

我不希望结果中存在硬代码部分Serialization.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9d77cc7ad89668eb,因为我需要将序列化结果作为基线。因为它是字段中genericType 的程序集限定名称。所以我找不到改变它的方法。

您能帮忙找到解决方法吗?

[DataContract(IsReference = true)]
public class Collection2
{
    [DataMember]
    public IList<Simple> List2;
}
[DataContract(IsReference = true)]
public class Simple
{
    [DataMember]
    public string Data;
    public Simple() { }
}

【问题讨论】:

    标签: c# wcf serialization


    【解决方案1】:

    您可以使用CollectionDataContract 围绕列表编写一个包装类:

    [CollectionDataContract]
    public class SimpleList: List<Simple> {
        public SimpleList() { }
        public SimpleList(IEnumerable<Simple> simple) : base(simple) { }
    }
    

    然后修改Collection2 使用这个类来代替:

    [DataMember]
    public SimpleList List2;
    

    【讨论】:

    • 非常感谢。我已经尝试过这种方法。这个想法对我很有帮助。我将在 IEnumerable、ICollection、IDictionary、IList 字段上执行此操作。
    猜你喜欢
    • 2010-10-02
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    相关资源
    最近更新 更多