C# 转换为Mock需要接口。无法序列化Xml

C# 转换为Mock需要接口。无法序列化Xml,c#,interface,xml-serialization,mocking,C#,Interface,Xml Serialization,Mocking,我正在转换一个项目,以便使用Moq(模拟)测试 我有一个类,它有一个接口列表。我理解接口不能被序列化。所以我正在努力解决这个问题 然而,在尝试了其他SO帖子中的许多方法后,我创建了一个控制台进行测试(,);我觉得我需要寻求帮助 下面的示例代码将列表包装在自己的类中,以便能够实现ISerializable接口。但是,我总结了以下错误: Cannot serialize member MyConcreteCollection.ChildList of type IChild because it

我正在转换一个项目,以便使用Moq(模拟)测试

我有一个类,它有一个接口列表。我理解接口不能被序列化。所以我正在努力解决这个问题

然而,在尝试了其他SO帖子中的许多方法后,我创建了一个控制台进行测试(,);我觉得我需要寻求帮助

下面的示例代码将列表包装在自己的类中,以便能够实现ISerializable接口。但是,我总结了以下错误:

Cannot serialize member MyConcreteCollection.ChildList of type IChild because 
it is an interface.
问题就在这段代码中

public void WriteXml(System.Xml.XmlWriter writer)
{
    //-- HAVE also tried IChild child in ChildList
    foreach (ConcreteChild child in ChildList)
    {
        XmlSerializer s = new XmlSerializer(child .GetType());
        s.Serialize(writer, child );
    }
}
以下是完整的代码列表。这正在工作,并已由用户Jay实施修复

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.IO;

[Serializable]
public class ConcreteParent
{
    public MyConcreteCollection MyConcreteCollection { get; set; }
}

[Serializable]
public class MyConcreteCollection : IXmlSerializable //(Was ISerializable, as fixed by user Jay)
{
    public List<IChild> ChildList { get; set; }

    public System.Xml.Schema.XmlSchema GetSchema() { return null; }
    public void ReadXml(System.Xml.XmlReader reader) { }
    public void GetObjectData(SerializationInfo info, StreamingContext context) { }

    public void WriteXml(System.Xml.XmlWriter writer)
    {
        foreach (ConcreteChild child in ChildList)
        {
            XmlSerializer s = new XmlSerializer(child.GetType());
            s.Serialize(writer, child);
        }
    }

}

public interface IChild { }
[Serializable] public class ConcreteChild : IChild { }


public static class SerializerHelper<T>
{
    public static string Serialize(T myobject)
    {
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
        StringWriter stringWriter = new StringWriter();
        xmlSerializer.Serialize(stringWriter, myobject);
        string xml = stringWriter.ToString();

        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.LoadXml(xml);
        StringWriter sw = new StringWriter();
        XmlTextWriter xw = new XmlTextWriter(sw);
        xmlDoc.WriteTo(xw);

        return sw.ToString();
    }
}

class Program
{
    static void Main(string[] args)
    {
        try
        {
            ConcreteParent concreteParent = new ConcreteParent();
            concreteParent.MyConcreteCollection = new MyConcreteCollection();
            concreteParent.MyConcreteCollection.ChildList = new List<IChild>();
            concreteParent.MyConcreteCollection.ChildList.Add(new ConcreteChild());

            string xml = SerializerHelper<ConcreteParent>.Serialize(concreteParent);
            Console.WriteLine(xml);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
        Console.ReadKey();
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Runtime.Serialization;
使用系统文本;
使用System.Xml;
使用System.Xml.Serialization;
使用System.IO;
[可序列化]
公共类具体化父类
{
公共MyConcreteCollection MyConcreteCollection{get;set;}
}
[可序列化]
公共类MyConcreteCollection:IXmlSerializable//(是ISerializable,由用户Jay修复)
{
公共列表子列表{get;set;}
public System.Xml.Schema.XmlSchema GetSchema(){return null;}
public void ReadXml(System.Xml.XmlReader reader){}
public void GetObjectData(SerializationInfo信息,StreamingContext上下文){}
public void WriteXml(System.Xml.XmlWriter)
{
foreach(ChildList中的ConcreteChild)
{
XmlSerializer s=新的XmlSerializer(child.GetType());
s、 连载(作者、孩子);
}
}
}
公共接口IChild{}
[Serializable]公共类ConcreteChild:IChild{}
公共静态类序列化RHELPER
{
公共静态字符串序列化(T myobject)
{
XmlSerializer XmlSerializer=新的XmlSerializer(typeof(T));
StringWriter StringWriter=新StringWriter();
序列化(stringWriter,myobject);
string xml=stringWriter.ToString();
XmlDocument xmlDoc=新的XmlDocument();
LoadXml(xml);
StringWriter sw=新的StringWriter();
XmlTextWriter xw=新的XmlTextWriter(sw);
xmlDoc.WriteTo(xw);
返回sw.ToString();
}
}
班级计划
{
静态void Main(字符串[]参数)
{
尝试
{
ConcreteParent ConcreteParent=新的ConcreteParent();
concreteParent.MyConcreteCollection=新的MyConcreteCollection();
concreteParent.MyConcreteCollection.ChildList=新列表();
concreteParent.MyConcreteCollection.ChildList.Add(new-ConcreteChild());
字符串xml=SerializerHelper.Serialize(concreteParent);
Console.WriteLine(xml);
}
捕获(例外情况除外)
{
Console.WriteLine(例如ToString());
}
Console.ReadKey();
}
}

您有
MyConcreteCollection
实现
ISerializable
。正如您链接到的第一篇文章所示,您需要实现
IXmlSerializable

啊,谢谢您的关注。我要回到我邪恶的复制粘贴方式