C# xxxx类型不应使用xmlinclude或soapinclude

C# xxxx类型不应使用xmlinclude或soapinclude,c#,xml,rest,serialization,C#,Xml,Rest,Serialization,我对这个系列化问题有一个奇怪的案例——这个问题在这个网站上被问了很多次,我已经解决了其中的一些问题,并尝试了一些常见的项目,但都没有结果: 将[XmlInclude]添加到引发错误的类 删除名称空间 为每个类添加不同的命名空间 为了进一步解释,我在下面提供了我的代码的简化版本。本质上,我使用一个WebServiceHost对象来运行RESTful服务,我的一个端点返回一个序列化为XML的对象(我用[DataContract]和[DataMember]属性对该对象进行了注释)。此对象包含一个S

我对这个系列化问题有一个奇怪的案例——这个问题在这个网站上被问了很多次,我已经解决了其中的一些问题,并尝试了一些常见的项目,但都没有结果:

  • 将[XmlInclude]添加到引发错误的类
  • 删除名称空间
  • 为每个类添加不同的命名空间
为了进一步解释,我在下面提供了我的代码的简化版本。本质上,我使用一个
WebServiceHost
对象来运行RESTful服务,我的一个端点返回一个序列化为XML的对象(我用
[DataContract]
[DataMember]
属性对该对象进行了注释)。此对象包含一个
SerializableDictionary
(),其中的值已键入为
对象
。我相信这就是它失败的原因:

  • 为该值指定基本体时工作正常
  • 当我将一个自定义对象分配给KV pair V时,我得到了意外的类型异常,可能是因为序列化程序不知道如何序列化该对象/某种名称空间问题
显然,我无法用
[xmlclude]
注释Object.cs,因为它是一项服务,而且我自己也没有序列化,所以我不能使用类似的东西

new Serializer(typeof(...), new Type[] { ... }}
你知道我能做什么吗?我考虑过不要将dict值键入object,这样会更具体,但问题是这个值可以采用原语或cusotm类型。一些代码用于解释上述内容:

编辑:更新了下面的代码,使其更加清晰

[DataContract]
public class ResponseObject
{
    [DataMember(Name = "data")]
    public SerializableDictionary<string, object> Data { get;set; }

    public ResponseObject()
    {
        Data = new SerializableDictionary<string, object>();
    }
}

...

var d1 = new ResponseObject();
d1.Data.Add("some key", "some value"); //WORKS AND SERIALIZES PERFECLTY

var d2 = new ResponseObject();
d2.Data.Add("some other key", new SomeOtherObjecT());
var d3 = new ResponseObject();
d3.Data.Add("another key", d2);  //THIS THROWS THE UNEXPECTED TYPE ERROR WHEN SEIRLAIZING SomeOtherObject
[DataContract]
公共类响应对象
{
[DataMember(Name=“data”)]
公共SerializableDictionary数据{get;set;}
公共响应对象()
{
数据=新的SerializableDictionary();
}
}
...
var d1=新的响应对象();
d1.数据。添加(“某些键”、“某些值”)//工作并序列化性能
var d2=新的响应对象();
d2.Data.Add(“某个其他键”,new SomeOtherObjecT());
var d3=新响应对象();
d3.数据添加(“另一个键”,d2)//这会在SEIRLAIZING其他对象时引发意外的类型错误

编辑:该错误在SerializableDictionary中抛出,它试图序列化ResponseObject类型的对象。这两个项目是分开的-如果这很重要?

通常,您应该向ResponseObject类添加一个[xmlclude]。在本例中,由于您正在使用的SerializableDictionary,它不起作用。该类在其实现中创建另一个XmlSerializer,因此它不关心[XmlInclude]的。基本上,它无法处理您的用例。您应该从XmlSerializer切换到DataContractSerializer,后者处理字典类并支持[KnownType]属性以注册其他类型:。还请注意,在当前情况下添加[DataContract]和[DataMember]属性是毫无意义的,因为XmlSerializer忽略这些属性,它们仅由DataContractSerializer使用。或者,如果您不确定如何更改序列化程序(我知道我不知道),那么您不应该使用字典,或者更改SerializableDictionary实现来处理要使用的动态对象类型(查找创建新XmlSerializer的每一行)。或者,作为一种替代方法,为所有要放入字典的对象定义一个基类,并按如下方式执行:

[XmlInclude(typeof(Class1), XmlInclude(typeof(Class2)), etc]
public class AbstractBase { }

public class Class1 : AbstractBase { ... }

public class Class2 : AbstractBase { ... }

public class BigClass {
    public SerializableDictionary<string, AbstractBase> Dictionary { get; set; }
}
[xmlclude(typeof(Class1)、xmlclude(typeof(Class2))等]
公共类抽象基{}
公共类Class1:AbstractBase{…}
公共类Class2:AbstractBase{…}
公共类BigClass{
公共SerializableDictionary{get;set;}
}
这样,当SerializableDictionary创建自己的XmlSerializer时,它将识别AbstractBase及其所有子体