接口的XML序列化

时间:2012-02-06 09:56:49

标签: c# .net xml serialization interface

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

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

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

遵循文章方法,使用XmlInclude属性,我获得了一个强大的耦合解决方案,但我的应用程序结构化使用插件方法,所以我可以拥有如此多的实现,因为我想要我的界面

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

4 个答案:

答案 0 :(得分:2)

如果你想使用XmlSerializer,你需要有一个基类,而不是一个接口。

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

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

var serializer = new XmlSerializer(myBaseType, arrayOfConcreteImplementations);

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

答案 1 :(得分:1)

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

如何使用二进制序列化器

/// <summary>
/// Serializes the given object to byte stream
/// </summary>
public sealed class Serializer {
    /// <summary>
    /// Serializes the given object to byte stream
    /// </summary>
    /// <param name="objectToSeralize">Object to be serialized</param>
    /// <returns>byte array of searialize object</returns>
    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;
    }
    /// <summary>
    /// De-Serialize the byte array to object
    /// </summary>
    /// <param name="arrayToDeSerialize">Byte array of Serialize object</param>
    /// <returns>De-Serialize object</returns>
    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;
    }
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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