【问题标题】:Converting to Mock requires interface. Cannot Xml serialize转换为 Mock 需要接口。无法 Xml 序列化
【发布时间】:2011-09-06 02:14:59
【问题描述】:

我正在转换一个项目,以便可以使用 Moq (Mock) 测试。

我有一个具有接口列表的类。我了解接口无法序列化。所以我正在努力解决它。

在尝试了其他 SO 帖子(Serializing a List hold an interface to XMLXmlSerializer serialize generic List of interface)的多种方法之后,我创建了一个控制台进行测试;我觉得我需要寻求帮助。

下面的示例代码将 List 包装在自己的类中,以便能够实现 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();
    }
}

【问题讨论】:

    标签: c# interface xml-serialization mocking


    【解决方案1】:

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

    【讨论】:

    • 啊,谢谢你接受这个。我将回到我的邪恶副本和粘贴方式。 :)
    猜你喜欢
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    相关资源
    最近更新 更多