.Net Core 使用 IEnumerables<T> 序列化对象以另存为 XML

.Net Core Serialize an Object with IEnumerables<T> to Save as XML

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

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

我目前能够将我的对象序列化为 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);

下面是我的 Class 视图模型:

旧视图

[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; }
}

关于我遗漏的任何方向?

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

通过使用 Gusman 和 LB2 的评论,我解决了这个问题。正如 LB2 所述 "with IEnumerable as the type, deserializer wouldn't know what class to actually instantiate to back the interface during deserialization."

这就是错误发生的原因,但是 Class 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), knownTypeList);
        ser.WriteObject(writer, legacyData);
    }