接口的XML序列化

我需要在项目中序列化复杂对象并将它们放在数据库中。 我想使用XML序列化它们,以便更轻松地调试我的应用程序。

我的情况与本文中描述的情况非常相似: http : //geekswithblogs.net/SoftwareDoneRight/archive/2008/01/16/how-to-serialize-an-interface-using-the-xmlserializer.aspx

所以我有一个包含Property的对象,该类型由接口定义。 然后我有不同的具体类型来实现它。

按照文章方法,使用XmlInclude属性,我获得了一个强大的耦合解决方案,但我的应用程序结构化使用插件方法,所以我可以有我想要的界面实现这么多的实现。

有没有办法使用xml序列化解决我的问题,或者我必须使用二进制序列化?

阅读geekswithblogs.net上的post。 我建议你做二进制序列化。 它易于实现和维护(除非您更改类的限定名称)。 Binary Serializer也将私有成员序列化。

如何使用二进制序列化器

 ///  /// Serializes the given object to byte stream ///  public sealed class Serializer { ///  /// Serializes the given object to byte stream ///  /// Object to be serialized /// byte array of searialize object public static byte[] Serialize(object objectToSeralize) { byte[] objectBytes; using (MemoryStream stream = new MemoryStream()) { //Creating binary formatter to serialize object. BinaryFormatter formatter = new BinaryFormatter(); //Serializing objectToSeralize. formatter.Serialize(stream, objectToSeralize); objectBytes = stream.ToArray(); } return objectBytes; } ///  /// De-Serialize the byte array to object ///  /// Byte array of Serialize object /// De-Serialize object public static object DeSerialize(byte[] arrayToDeSerialize) { object serializedObject; using (MemoryStream stream = new MemoryStream(arrayToDeSerialize)) { //Creating binary formatter to De-Serialize string. BinaryFormatter formatter = new BinaryFormatter(); //De-Serializing. serializedObject = formatter.Deserialize(stream); } return serializedObject; } } 

如果要使用XmlSerializer,则需要具有基类,而不是接口。

XmlInclude只是告诉序列化程序可能实现的一种方法。 另一种方法是将包含的类型实际传递到序列化器中。

只需枚举应用程序中从基类派生的所有类型(使用reflection),并将它们作为已知类型的数组传递给序列化程序:

 var serializer = new XmlSerializer(myBaseType, arrayOfConcreteImplementations); 

与DataContractSerializer完全相同:第二个参数是您可以使用reflection找到的已知类型的集合),但使用它您可能能够支持接口…

XmlSerializer不支持接口的序列化。 但是,如果使用KnownType属性修饰属性,则可以使用Data Contract Serializer。

我解决了这个问题,包括接口中名为SerializeMyself的方法。 我不知道这是否是最优雅的解决方案……但它对我有用。