TOP

wsdl 关于nillable和minOccurs 在.NET和java中的不同(十一)
2019-09-03 03:26:46 】 浏览:106
Tags:wsdl 关于 nillable minOccurs .NET java 不同

etSystemStatus xmlns="http://com.csii.bank.core/system"> <person> <id3 xsi:nil="true"/> <id4>0</id4> <name3 xsi:nil="true"/> <name4>123</name4> </person> </GetSystemStatus> </soapenv:Body> </soapenv:Envelope>

3.2.4 得出结论:
其一:对于值类型和包装:
  1、除 [ minOccurs=1,nillable=false ] 这一组合除外,生成的都是包装类型。
  2、当对象属性为null时,java根据minOccurs构造soap报文,如果minOccurs=0则[元素节点]不出现代表null,如果minOccurs=1用nil=true表示null。
其二:对于普通引用类型
  生成的肯定是引用类型(这是废话),当对象属性为null是,构造soap报文的规则和上面的2一样
4、深入浅出,最后的总结
不管是由代码生成wsdl,还是由wsdl生成代码,此实验中java都比.NET要简洁,个人比较喜欢java的方式,.NET显得有点儿啰嗦(它把包装类型和普通引用类型做了区分),下面进行最后的总结。
先来总结由代码生成wsdl
java用到了两种组合:
   [minOccurs=1、
nillable=false]:只有值类型用这一组合
   [minOccurs=1、
nillable=true]:包装类型和普通引用类型用这一组合
   注:其实Java用[minOccurs=0 和nillable=false]代表包装类型和普通引用类型也完全可以,如果是我的话我会用这一组合代替上面的组合,这样可以节省网络流量
而.NET有3种组合:
   [ minOccurs=1、nillable=false]:只有值类型用这一组合
   [ minOccurs=1、nillable=true ] :包装类型用这一组合
   [ minOccurs=0、nillable=false]:普通引用类型用这一组合
现在如果要我们自己写一个生成wsdl的框架,那应该有如下的原则:
   1>  值类型只能用
[minOccurs=1、nillable=false],而包装类型和普通引用类型不能用这一组合(否则空对象无法表示) 
   
2>  包装类型可以用[minOccurs=1、nillable=true]和[ minOccurs=0、nillable=false]
  3> 普通引用类型可以用
[minOccurs=1、nillable=true]和[ minOccurs=0、nillable=false]
  
4> 对于包装类型和普通引用类型不建议用[minOccurs=0、nillable=true],这一组合意义不够明确,究竟是空报文节点表示null呢?还是nill=true表示null呢?当然如果真这么用肯定也没问题,只要序列化工具支持就行。

再来看由wsdl生成代码
我是很难理解微软为什么要把[包装类型]和[普通引用类型]区别对待,在C#_2_WSDL的时候这么区别开到还没什么,但是当WSDL_2_C#的时候就带来很大的麻烦。
1、首先来看<element name="long" type="dateTime" minOccurs="0" nillable="false"/>,对这一组合微软生成的是值类型而不是包装类型,它认为只有nillable=true才代表包装类型,可包装类型和普通引用类型本质上有太大的区别吗?大家都是引用类型,[minOccurs=1、nillable=true]和[
minOccurs=0、nillable=false]应该都可以被解析为包装类型才合适。你微软如果认为nillable=true和包装类型(微软的可空类型)联系那么紧密,那这样的节点<element name="name3" type="string" minOccurs="1" nillable="true"/>最好还是别支持了,但现在普通应用类型你既支持minOccurs=0又支持nillable=true,那包装类型和普通引用类型分开的必要性究竟是神马!!!!!!
2、再来看xxxSpecified,前面说到,微软认为对于像type=int这样的节点,如果element定义中出现了minOccurs=0,则要生成一个xxxSpecified属性。这么搞使用起来简直太麻烦了——让程序员指定xxxSepcified为true或false来控制元素节点要不要显示,这种麻烦还是由于“区别对待”带来的。微软只通过nillable判断是否是包装类型,对于minOccurs=0的情况它不得不生成一个xxxSpecified。而如果不区别对待的话就简单多了,只要minOccurs=0和nillable=true随便哪个出现或同时出现,直接生成包装类型。

最后来总结序列化
序列化的时候,java和.NET在处理上也不尽相同:
1、java优先考虑minOccurs,如果minOccurs=0,那不管nillable等于神马,程序中的null以[元素节点]不出现的方式来体现;如果minOccurs=1,则程序中的null以[元素取值]为空的方式来体现;这样的规则同时适用于值类型、包装类型和普通引用类型。
2、而.NET则优先考虑nillable,如果nillable=true,那不管minOccurs等于神马,程序中的null以[元素取值]为空的方式来体现;如果nillable=false,则程序中的null以[元素节点]不出现的方式来体现;这样的规则同时适用于值类型、包装类型和普通引用类型。(注:Specified=true的前提下)

 

 

引用地址: http://www.xuebuyuan.com/1925655.html


wsdl 关于nillable和minOccurs 在.NET和java中的不同(十一) https://www.cppentry.com/bencandy.php?fid=106&id=248909

首页 上一页 8 9 10 11 下一页 尾页 11/11/11
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇《深入.NET平台和C#编程》内部测.. 下一篇.NET中使用反射访问属性方法