我需要在项目中序列化复杂对象并将它们放在数据库中。我想使用XML对它们进行序列化,以便更轻松地调试我的应用程序。
我的情况与本文中描述的内容非常相似:http://geekswithblogs.net/SoftwareDoneRight/archive/2008/01/16/how-to-serialize-an-interface-using-the-xmlserializer.aspx
所以我有一个包含Property的对象,该类型由接口定义。然后我有不同的具体类型来实现它。
遵循文章方法,使用XmlInclude
属性,我获得了一个强大的耦合解决方案,但我的应用程序结构化使用插件方法,所以我可以拥有如此多的实现,因为我想要我的界面
有没有办法使用xml序列化解决我的问题,或者我必须使用二进制序列化?
答案 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的方法。我不知道这是否是最优雅的解决方案......但它对我有用。