【发布时间】:2017-07-11 10:13:44
【问题描述】:
我在返回一个结构数组时遇到问题,而一个简单的结构可以完美地工作。服务器端:
[OperationContract] long GetPapers([Out] array<PAPER_INFO>^% PaperInfo); -- FAIL
[OperationContract] long GetPaper([Out] PAPER_INFO% PaperInfo); -- SUCCESS
客户端:
[OperationContract] long GetPapers(out PAPER_INFO[] PaperInfo); -- FAIL
[OperationContract] long GetPaper(out PAPER_INFO PaperInfo); -- SUCCESS
失败的意思是没有错误信息,只是一个空数组进来。结构很简单,只使用简单的类型,序列化没有问题。
[StructLayout(LayoutKind::Sequential, Pack = 1)]
public value struct PAPER_INFO {
unsigned int PaperWidth;
unsigned int PaperLength;
};
登录服务器并使用 WCF 测试客户端进行测试清楚地表明数组已填充、发送回,因此问题出在客户端,数据的反序列化。尽管上面的结构本身应该作为推断数据协定工作,但我也尝试使用DataContract 和DataMember 属性对其进行装饰,而在行为上没有任何区别。已知类型用于不同目的,但我也尝试过,以防万一,也没有区别。
什么会使数组而不是结构本身有问题?
【问题讨论】:
-
不应该有
array<PAPER_INFO%>^而不是array<PAPER_INFO>^%吗? -
编译器不这么认为:“cli::array 的元素类型必须是句柄或值类型”。
-
所以这个 PAPER_INFO 是你的 cli 类型?然后试试
array<PAPER_INFO^>^? -
那时我还看不到如何填充它。但是给一个明确的值结构加个帽子?
-
不,这根本不是 C++ 方面。毕竟,这是一个数据合同问题。
标签: c# arrays wcf struct c++-cli