Я конвертирую проект, чтобы я мог использовать Moq (Mock) тестирование.
У меня есть класс, у которого есть Список интерфейсов. Я понимаю, что интерфейсы не могут быть сериализованы. Поэтому я пытаюсь обойти это.
Я создал консоль для тестирования, однако, после попытки многочисленных методов из других сообщений SO ( Сериализация списка содержит интерфейс к XML , XmlSerializer сериализует универсальный список интерфейса ) ; Я чувствую, что мне нужно обратиться за помощью.
Пример кода ниже упаковывает список в свой собственный класс, чтобы иметь возможность реализовать интерфейс 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();
}
}