类型xxxx不期望使用xmlinclude或soapinclude

cli*_*cky 7 c# xml rest serialization

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

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

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

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

显然,我无法用Objectcs注释[XmlInclude],因为它是一个服务,我不是自己序列化我不能使用类似的东西

new Serializer(typeof(...), new Type[] { ... }}
Run Code Online (Sandbox Code Playgroud)

我有什么想法可以做什么?我想过不要将dict值键入为对象,而是更具体但问题是这个值可以采用原语或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
Run Code Online (Sandbox Code Playgroud)

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

fej*_*oco 10

通常,您应该向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<string, AbstractBase> Dictionary { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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