C# 为什么不是';无法将像IList这样的接口序列化为Xml文件<;T>;?
我试图将一个声明为ILIst的对象序列化为Xml文件,但它是List的一个实例。异常告诉我原因:无法序列化接口C# 为什么不是';无法将像IList这样的接口序列化为Xml文件<;T>;?,c#,xml,serialization,interface,xml-serialization,C#,Xml,Serialization,Interface,Xml Serialization,我试图将一个声明为ILIst的对象序列化为Xml文件,但它是List的一个实例。异常告诉我原因:无法序列化接口 这在我的设计中是非常必要的,或者我必须以其他方式序列化它?您必须知道要实例化的具体类型 序列化程序必须根据元数据,而不是运行时类型。如果您只知道目标对象必须实现IList,那么您会构造什么?甚至不一定有实现它的类。您必须知道要实例化的具体类型 序列化程序必须根据元数据,而不是运行时类型。如果您只知道目标对象必须实现IList,那么您会构造什么?甚至不一定有实现它的类。我可以看到两个选项
这在我的设计中是非常必要的,或者我必须以其他方式序列化它?您必须知道要实例化的具体类型
序列化程序必须根据元数据,而不是运行时类型。如果您只知道目标对象必须实现IList,那么您会构造什么?甚至不一定有实现它的类。您必须知道要实例化的具体类型 序列化程序必须根据元数据,而不是运行时类型。如果您只知道目标对象必须实现IList,那么您会构造什么?甚至不一定有实现它的类。我可以看到两个选项:
无法序列化接口,因为它不包含任何数据。您所能做的最好的事情可能是实现ISerializable以自己控制序列化。您无法序列化接口,因为它不包含任何数据。您所能做的最好的事情可能是实现ISerializable以自己控制序列化。这应该不是问题,您可以始终使用object.GetType()。下面是一个例子:
using System;
using System.Collections.Generic;
using System.Xml.Serialization;
class Program {
static void Main(string[] args) {
System.Collections.IList list = new List<int> { 1, 2, 3 };
var ser = new XmlSerializer(list.GetType());
ser.Serialize(Console.Out, list);
Console.ReadLine();
}
}
使用系统;
使用System.Collections.Generic;
使用System.Xml.Serialization;
班级计划{
静态void Main(字符串[]参数){
System.Collections.IList list=新列表{1,2,3};
var ser=新的XmlSerializer(list.GetType());
序列序列化(Console.Out,list);
Console.ReadLine();
}
}
这应该不是问题,您可以始终使用object.GetType()。下面是一个例子:
using System;
using System.Collections.Generic;
using System.Xml.Serialization;
class Program {
static void Main(string[] args) {
System.Collections.IList list = new List<int> { 1, 2, 3 };
var ser = new XmlSerializer(list.GetType());
ser.Serialize(Console.Out, list);
Console.ReadLine();
}
}
使用系统;
使用System.Collections.Generic;
使用System.Xml.Serialization;
班级计划{
静态void Main(字符串[]参数){
System.Collections.IList list=新列表{1,2,3};
var ser=新的XmlSerializer(list.GetType());
序列序列化(Console.Out,list);
Console.ReadLine();
}
}
我想您需要使用IList保持设计的原因是因为它是其他模块的通用接口。一种可能的解决办法:
而不是:
[XmlElement("Test")]
public IList<String> Tests
{
get;
set;
}
[XmlElement(“测试”)]
公共IList测试
{
得到;
设置
}
您可能可以尝试:
[XmlElement("Test")]
public List<String> TestList
{
get;
set;
}
[XmlIgnore]
public IList<String> Tests
{
get { return TestList; }
}
[XmlElement(“测试”)]
公共列表测试列表
{
得到;
设置
}
[XmlIgnore]
公共IList测试
{
获取{return TestList;}
}
通过这种方式,您可以保留相同的接口,同时利用.Net Xml库中的序列化/反序列化功能。我想您需要使用IList保留设计的原因是因为它是其他模块的通用接口。一种可能的解决办法: 而不是:
[XmlElement("Test")]
public IList<String> Tests
{
get;
set;
}
[XmlElement(“测试”)]
公共IList测试
{
得到;
设置
}
您可能可以尝试:
[XmlElement("Test")]
public List<String> TestList
{
get;
set;
}
[XmlIgnore]
public IList<String> Tests
{
get { return TestList; }
}
[XmlElement(“测试”)]
公共列表测试列表
{
得到;
设置
}
[XmlIgnore]
公共IList测试
{
获取{return TestList;}
}
通过这种方式,您可以保持相同的接口,同时利用.Net Xml库中的序列化/反序列化功能。周围有许多重复项,请使用Search试用可能重复的可能重复项周围有许多重复项,使用Search试用可能重复的可能重复项,我有一个对象(我计划序列化),它有一个属性,它是一个列表,你认为我可以在XmlArray中指定类型吗?我有一个对象(我计划序列化),它有一个属性,它是一个列表,你认为我可以在XmlArray中指定类型吗?