Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 接口的XML序列化_C#_.net_Xml_Serialization_Interface - Fatal编程技术网

C# 接口的XML序列化

C# 接口的XML序列化,c#,.net,xml,serialization,interface,C#,.net,Xml,Serialization,Interface,我需要序列化项目中的复杂对象并将它们放入数据库中。我想使用XML对它们进行序列化,以便更轻松地调试我的应用程序 我的案例与本文描述的非常相似: 因此,我有一个包含属性的对象,该属性的类型由接口定义。然后我有不同的具体类型来实现它 按照本文的方法,使用xmlclude属性,我获得了一个强耦合的解决方案,但我的应用程序是使用插件方法构建的,因此我可以根据我的接口需要有很多实现 有没有办法使用xml序列化来解决我的问题,或者我必须使用二进制序列化?XmlSerializer不支持接口的序列化。但是,如

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

我的案例与本文描述的非常相似:

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

按照本文的方法,使用
xmlclude
属性,我获得了一个强耦合的解决方案,但我的应用程序是使用插件方法构建的,因此我可以根据我的接口需要有很多实现


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

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

我在接口中包含了一个名为serializel的方法,从而解决了此问题。我不知道这是否是最优雅的解决方案。。。但这对我来说很有效。

请阅读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;
    }
}
//
///将给定对象序列化为字节流
/// 
公共密封类序列化程序{
/// 
///将给定对象序列化为字节流
/// 
///要序列化的对象
///searialize对象的字节数组
公共静态字节[]序列化(对象ObjectToSerialize){
字节[]对象字节;
使用(MemoryStream stream=new MemoryStream()){
//正在创建二进制格式化程序以序列化对象。
BinaryFormatter formatter=新的BinaryFormatter();
//序列化ObjectToSerialize。
序列化(流,ObjectToSerialize);
objectBytes=stream.ToArray();
}
返回objectBytes;
}
/// 
///将字节数组反序列化为对象
/// 
///序列化对象的字节数组
///反序列化对象
公共静态对象反序列化(字节[]arrayToDeSerialize){
对象序列化对象;
使用(MemoryStream stream=新的MemoryStream(arrayToDeSerialize)){
//正在创建二进制格式化程序以反序列化字符串。
BinaryFormatter formatter=新的BinaryFormatter();
//反序列化。
serializedObject=格式化程序。反序列化(流);
}
返回序列化对象;
}
}

如果要使用XmlSerializer,需要的是基类,而不是接口

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

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

var serializer = new XmlSerializer(myBaseType, arrayOfConcreteImplementations);

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

我从未使用过
KnownType
属性,但在阅读文档时,这似乎是我的问题的另一个高耦合解决方案……您的接口是否也可以实现IXmlSerializable?您必须在每种类型中实现ReadXml和WriteXml,但是可以使用XmlSerializer在第二个类中实现。您正在按照geekswithblogs博客中的建议自行序列化对象。如果对你有用的话,很好。我想我会按照你的建议使用二进制序列化。你能告诉我我必须使用哪些课程吗?(我从未用.NET做过…)太好了!非常感谢!:)+1我认为你的解决方案不能完全解决我的问题。。。我可以让对象递归地包含“抽象类型属性”:一个对象包含一个抽象属性,而在实现中包含一个抽象属性。。。等等