.Net Core使用IEnumerables <t>序列化一个对象以保存为XML

时间:2017-06-08 22:32:41

标签: c# xml xml-serialization .net-core

我正在使用.net Core 1.1并编写控制台应用程序。我需要使用字符串和int的一些基本属性序列化一个对象以及一些IEnumerable对象并将其序列化为XML,这样我就可以将它保存到&#34; data.xml&#34;文件。

我收到例外: System.Runtime.Serialization.SerializationException:&#39; Type&#39; System.Collections.Generic.List`1 [[CorpsDataExtractor.ViewModels.LegacyView,CorpsDataExtractor,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null] ]&#39;使用数据合同名称&#39; ArrayOfLegacyView:http://schemas.datacontract.org/2004/07/CorpsDataExtractor.ViewModels&#39;不是预期的。将任何静态未知的类型添加到已知类型列表中 - 例如,使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。&#39;

我目前能够将我的Object序列化为JSON,但是在使用DataContractSerializer时遇到了麻烦。我添加了已知类型列表,该异常表明我缺少但仍然失败。

// This List isretrieved using Entity Framework Core
      List<LegacyView> legacyData = await _corpsRepo.ListLegacyData();

// The Below Line will write to a JSON File. No Error and works
        File.WriteAllText(@"E:\\CorporationsDataLegacy.json", JsonConvert.SerializeObject(legacyData));

// This Creates a Known Type List for the DataContractSerializer
        var knownTypeList = new List<Type>
        {
            typeof(LegacyView),
            typeof(People),
            typeof(DocumentType)
        };

        FileStream writer = new FileStream(@"E:\\data.xml", FileMode.Create);
        var ser = new DataContractSerializer(typeof(LegacyView), knownTypeList );
// When Debugging I Receive The stated exception at this line
        ser.WriteObject(writer, legacyData);

以下是我的班级ViewModel:

旧视图

[DataContract]
public class LegacyView
{
    [DataMember]
    public string Ubi { get; set; }
    [DataMember]
    public IEnumerable<Person> People{ get; set; }
    [DataMember]
    public IEnumerable<DocumentType> DocumentTypes { get; set; }
}

[DataContract]
public class Person
{ 
    [DataMember]
    public string FirstName { get; set; }
    [DataMember]
    public string MiddleName { get; set; }
}

文档

[DataContract]
public class DocumentType
{ 
    [DataMember]
    public string Document { get; set; }
    [DataMember]
    public DateTime? CompletedDate { get; set; }
}

我遗失的任何方向?

2 个答案:

答案 0 :(得分:1)

我可能有点偏离,因为我已经完成了更多的XmlSerialize而不是DataContracts,但我相信两者都假定内容的最终反序列化。并且以IEnumerable<T>作为类型,反序列化器不知道在反序列化期间实际实例化哪个类来支持接口。将字段更改为具体类而不是枚举,这应该有效。

答案 1 :(得分:1)

通过使用两个Gusman和LB2评论,我能够解决这个问题。由于LB2声明“使用IEnumerable作为类型,反序列化器不会知道在反序列化期间实际实例化哪个类来支持接口。”

这就是错误发生的原因,但是LegacyView [DataMember]级别不存在问题,它存在于传递给DataContractSerializer的已知类型中。

Gusman是正确的,我需要告诉DataContractSerializer这些将是一个可枚举的类型。

// I needed to tell the DataContractSerializer what the types were
    var knownTypeList = new List<Type>
    {
        typeof(List<LegacyView>),
        typeof(List<People>),
        typeof(List<DocumentType>)
    };

    using (var writer = new FileStream(@"E:\\myTestExample.xml", FileMode.Create)) 
    {
        var ser = new DataContractSerializer(typeof(LegacyView), ktList);
        ser.WriteObject(writer, legacyData);
    }