类型xxxx不期望使用xmlinclude或soapinclude

我有一个关于这个序列化问题的奇怪案例 – 在本网站上已经多次询问过,我已经完成了一些问题并尝试了常用项目无济于事:

  • 将[XmlInclude]添加到抛出错误的类中
  • 删除命名空间
  • 为每个类添加不同的命名空间

为了进一步解释,我在下面提供了我的代码的简化版本。 本质上我使用WebServiceHost对象来运行RESTful服务,我的一个端点返回一个序列化为XML的对象(我用[DataContract][DataMember]属性注释了对象)。 此对象包含SerializableDictionary ( 此处 ),其中值已作为object键入。 我相信这就是它失败的原因:

  • 在为值分配基元时,可以正常工作
  • 当我将自定义对象分配给KV对V时,我得到了意外的类型exception,可能是因为Serializer不知道如何对对象进行序列化/某种命名空间问题

显然,我无法使用[XmlInclude]注释Object.cs,因为它是一个服务,我不是自己序列化我不能使用像

 new Serializer(typeof(...), new Type[] { ... }} 

我有什么想法可以做什么? 我想过不输入dict值作为对象,而且更具体但问题是这个值可以采用原语或cusotm类型。 一些代码来解释上面的内容:

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

 [DataContract] public class ResponseObject { [DataMember(Name = "data")] public SerializableDictionary Data { get;set; } public ResponseObject() { Data = new SerializableDictionary(); } } ... 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 

编辑:在SerializableDictionary中抛出错误,它尝试序列化ResponseObject类型的对象。 这两个是在单独的项目 – 如果这是重要的?

通常,您应该向ResponseObject类添加[XmlInclude]。 在这种情况下,由于您正在使用的SerializableDictionary,它不起作用。 该类在其实现中创建了另一个XmlSerializer,因此它不关心你的[XmlInclude]。 基本上它只是无法处理您的用例。 您应该从XmlSerializer切换到处理Dictionary类的DataContractSerializer,并支持[KnownType]属性来注册其他类型: http : //pastebin.com/vGLSaxHF 。 另请注意,在当前情况下添加[DataContract]和[DataMember]属性毫无意义,因为XmlSerializer忽略了这些属性,它们仅由DataContractSerializer使用。 或者,如果您不确定如何更改序列化程序(我知道我不是),那么您应该不使用Dictionary或更改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 Dictionary { get; set; } } 

这样,当SerializableDictionary创建自己的XmlSerializer时,它将识别AbstractBase并从那里识别它的所有后代。