首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >接口的XML序列化

接口的XML序列化
EN

Stack Overflow用户
提问于 2012-02-06 17:56:49
回答 4查看 4.2K关注 0票数 1

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

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

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

按照本文的方法,使用XmlInclude属性,我获得了一个强耦合的解决方案,但是我的应用程序被构造为使用插件方法,所以我可以有任意多个接口的实现。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-06 18:05:28

请阅读来自geekswithblogs.net的帖子。我将建议您进行二进制序列化。它易于实现和维护(除非您更改了类的限定名)。二进制序列化程序也序列化私有成员。

如何使用二进制序列化程序

代码语言:javascript
运行
复制
/// <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;
    }
}
票数 1
EN

Stack Overflow用户

发布于 2012-02-06 18:05:50

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

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

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

代码语言:javascript
运行
复制
var serializer = new XmlSerializer(myBaseType, arrayOfConcreteImplementations);

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

票数 2
EN

Stack Overflow用户

发布于 2012-02-06 18:01:01

XmlSerializer不支持接口序列化。但是,如果用KnownType特性修饰属性,则可以改用数据协定序列化程序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9158353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档