我在服务器上设置了一个wcf服务,它为使用Flashbuilder4构建的flex项目提供数据。我使用了webservice内省特性来生成DTO和服务代理。其中一个DTO具有类型对象的属性。此泛型对象的内容将根据特定条件而有所不同,但始终是另一个复杂对象。在FB4中创建和填充vo非常顺利,但是当对象被序列化时,如下所示:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
<tns:GetC xmlns:tns="EP2ProblemDemo1">
<tns:anyObj>
<tns:Property1>yo!</tns:Property1>
<tns:Property2>yo! yo!</tns:Property2>
</tns:anyObj>
</tns:GetC>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>您可能会注意到,尽管引用了类型为anyObj的对象,但ClassB属性缺少任何类型的信息:
public class ClassA
{
public string Property1;
}
public class ClassB : ClassA
{
public string Property2;
}anyObj参数GetC缺少如下内容:
Xsi:type=“tns:B级”xmlns:tns="EP2ProblemDemo1“
这反过来会在wcf服务试图解码消息时产生错误。我认为服务是将anyObj的内容解释为不能隐式转换为基本对象的数组吗?
当将anyObj参数(类型对象)设置为ClassB实例时,类型信息似乎丢失了。这行为正确吗?我的印象是,即使您可以设置一个超类变量来引用它的一个子类,但是应该保留子类的类型信息,因此也应该包含在该对象的序列化表示中。
编辑,似乎FlashBuilder4序列化程序在发送回wcf服务时,从类型对象的属性中删除了具体的类型和命名空间信息,这样就无法反序列化看起来像数组的内容。此外,当在FB4中导入WSDL文件时,VO继承会丢失,因为它们最终会扩展EventDispatcher以便绑定。
解决方案我的解决方案是用AMF改变策略并转向远程处理,它在.NET中使用FluorineFXFluorineFX官方网站实现,它工作得很漂亮,并且由于数据作为字节数组被传输,因此具有较低的带宽消耗的好副作用。
我相信WebORBWebORB官方网站也可以用来在.net中实现AMF,但我还没有尝试过。
发布于 2011-03-02 10:25:07
你不能使用“任何”对象。您必须始终显式地描述允许哪些类型。检查KnownTypeAttribute和ServiceKnownTypeAttribute或DataContractResolver (我还没有太多的经验)。如果您确实需要发送任意数据,并且无法预先定义所有可能的对象,则可以使用XElement。在xsd中,它将被描述为xsd:any。
发布于 2011-03-02 14:09:08
希望这能有所帮助
https://stackoverflow.com/questions/5165070
复制相似问题