我正在使用.net Core 1.1并编写控制台应用程序。我需要使用字符串和int的一些基本属性序列化一个对象以及一些IEnumerable对象并将其序列化为XML,这样我就可以将它保存到" data.xml"文件。
我收到例外: System.Runtime.Serialization.SerializationException:' Type' 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的已知类型列表中。'
我目前能够将我的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; }
}
我遗失的任何方向?
答案 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);
}