我需要序列化项目中的复杂对象,并将它们放入数据库中。我想使用XML序列化它们,以便更容易地调试我的应用程序。
我的案例与本文中描述的非常相似:http://geekswithblogs.net/SoftwareDoneRight/archive/2008/01/16/how-to-serialize-an-interface-using-the-xmlserializer.aspx
因此,我有一个包含属性的对象,该属性的类型由接口定义。然后我有不同的具体类型来实现它。
按照本文的方法,使用XmlInclude
属性,我获得了一个强耦合的解决方案,但是我的应用程序被构造为使用插件方法,所以我可以有任意多个接口的实现。
有没有办法使用xml序列化来解决我的问题,或者我必须使用二进制序列化?
发布于 2012-02-06 10:05:28
请阅读来自geekswithblogs.net的帖子。我将建议您进行二进制序列化。它易于实现和维护(除非您更改了类的限定名)。二进制序列化程序也序列化私有成员。
如何使用二进制序列化程序
/// <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;
}
}
发布于 2012-02-06 10:05:50
如果你想使用XmlSerializer,你需要有一个基类,而不是一个接口。
XmlInclude只是将可能的实现告知序列化程序的一种方法。另一种方法是将包含的类型实际传递到序列化程序中。
只需枚举应用程序中从基类派生的所有类型(使用反射),并将它们作为已知类型的数组传递到序列化程序中:
var serializer = new XmlSerializer(myBaseType, arrayOfConcreteImplementations);
与使用DataContractSerializer完全相同:第二个参数是已知类型的集合,可以使用反射找到),但是使用它可以支持接口……
发布于 2012-02-06 10:01:01
XmlSerializer不支持接口序列化。但是,如果用KnownType特性修饰属性,则可以改用数据协定序列化程序。
https://stackoverflow.com/questions/9158353
复制相似问题