C# 如何序列化接口,如IList<;T>;

C# 如何序列化接口,如IList<;T>;,c#,list,interface,xml-serialization,C#,List,Interface,Xml Serialization,可能重复: 我希望序列化一个类(我们称之为s),它包含IList类型的属性,其中T是我定义的另一个类。当我试图将类S的实例序列化为XML时,出现了一个异常。这是可以理解的,因为XmlSerializer不知道使用哪个具体类。在序列化/反序列化实例时,是否有一种方法(希望使用属性)来指定要实例化的具体类。我对类S的实现创建了List类的一个实例。下面是一些代码来说明我的示例: using System; using System.Xml.Serialization; using System.I

可能重复:

我希望序列化一个类(我们称之为
s
),它包含
IList
类型的属性,其中
T
是我定义的另一个类。当我试图将类
S
的实例序列化为XML时,出现了一个异常。这是可以理解的,因为
XmlSerializer
不知道使用哪个具体类。在序列化/反序列化实例时,是否有一种方法(希望使用属性)来指定要实例化的具体类。我对类
S
的实现创建了
List
类的一个实例。下面是一些代码来说明我的示例:

using System;
using System.Xml.Serialization;
using System.IO;

[Serializable]
public class T { }

[Serializable]
public class S
{
    public IList<T> ListOfTs { get; set; }

    public S()
    {
        ListOfTs = new List<T>();
    }
}

public class Program
{
    public void Main()
    {
        S s = new S();
        s.ListOfTs.Add(new T());
        s.ListOfTs.Add(new T());
        XmlSerializer serializer = new XmlSerializer(typeof(S));
        serializer.Serialize(new StringWriter(), s);
    }
}
使用系统;
使用System.Xml.Serialization;
使用System.IO;
[可序列化]
公共类T{}
[可序列化]
公共类
{
公共IList列表{get;set;}
公共服务(
{
ListOfTs=新列表();
}
}
公共课程
{
公共图书馆
{
S=新的S();
s、 添加(新的T());
s、 添加(新的T());
XmlSerializer serializer=新的XmlSerializer(typeof);
serializer.Serialize(新的StringWriter(),s);
}
}
我希望在
ListOfTs
定义上方可以放置一个属性,该属性对序列化表示,“在序列化/反序列化时,假设
List
的一个实例”。

更改

public IList<T> ListOfTs { get; set; }
public IList ListOfTs{get;set;}

public List ListOfTs{get;set;}

然后它就会工作。

您可以实现
IXmlSerializable
接口,并使用Xml读取器和编写器手动实现序列化逻辑。

我认为对于此类问题,通常有两种方法

一种是使用,但由于您已经在使用XmlSerializer,您可能不想这样做

“替代方法”是拥有一个专门用于序列化的属性,并在序列化过程中忽略IList

[Serializable]
public class S
{
    IList<T> _listofTs;

    [XmlIgnore]
    public IList<T> ListOfTs { get _listofTs; set _listofTs = value; }

    [XmlElement(Name="Not Exactly the Greatest Solution!")]
    public List<T> ListOfTs { get _listofTs; set _listofTs = value; }

    public S()
    {
        ListOfTs = new List<T>();
    }
}
[可序列化]
公共类
{
IList_listofTs;
[XmlIgnore]
公共IList ListOfTs{get_ListOfTs;set_ListOfTs=value;}
[XmlElement(Name=“不完全是最好的解决方案!”)
公共列表ListOfTs{get_ListOfTs;set_ListOfTs=value;}
公共服务(
{
ListOfTs=新列表();
}
}

我会这样做,但这会更改
S
类的接口。虽然这不太可能产生实际影响,但从原则上讲,我想看看是否有办法在不改变类型的情况下解决问题。建议的解决方案虽然有效,但可能会破坏您的公共API体系结构在属性上使用XmlIgnore属性将完全忽略它。问题是在序列化中包含接口属性。
[Serializable]
public class S
{
    IList<T> _listofTs;

    [XmlIgnore]
    public IList<T> ListOfTs { get _listofTs; set _listofTs = value; }

    [XmlElement(Name="Not Exactly the Greatest Solution!")]
    public List<T> ListOfTs { get _listofTs; set _listofTs = value; }

    public S()
    {
        ListOfTs = new List<T>();
    }
}