繁体   English   中英

类型xxxx不期望使用xmlinclude或soapinclude

[英]type xxxx not expected use xmlinclude or soapinclude

对于这个序列化问题,我有一个很好奇的案例-在该站点上已经问了很多遍了,我经历了以下几个问题,并尝试了平常的项目,但无济于事:

  • 将[XmlInclude]添加到引发错误的类中
  • 删除名称空间
  • 向每个类添加不同的名称空间

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

  • 将值分配为基元时,效果很好
  • 将自定义对象分配给KV对V时, 出现意外的类型异常,可能是因为序列化器不知道如何序列化对象/某种命名空间问题

显然,我无法使用[XmlInclude]注释Object.cs,并且由于它是一项服务,而且我自己也无法序列化,因此无法使用类似

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

关于我能做什么的任何想法? 我考虑过不要将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

编辑:在尝试序列化类型为ResponseObject的对象的SerializableDictionary中引发该错误。 两者在单独的项目中-是否有意义?

通常,应将[XmlInclude]添加到ResponseObject类。 在这种情况下,由于您使用的SerializableDictionary,它不起作用。 该类在其实现中创建另一个XmlSerializer,因此它并不关心您的[XmlInclude]。 基本上,它只是无法处理您的用例。 您应该从XmlSerializer切换到DataContractSerializer,后者处理Dictionary类并支持[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; }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM