为啥带有附加字段“指定”的字段始终为空?

Posted

技术标签:

【中文标题】为啥带有附加字段“指定”的字段始终为空?【英文标题】:Why fields with additional field "Specified" are always null?为什么带有附加字段“指定”的字段始终为空? 【发布时间】:2013-10-31 09:37:36 【问题描述】:

我有应用程序。这里我从 WSDL 生成客户端服务。现在有些功能可以正常工作。但有些是错误的。

它是 WSDL 的一部分

<xs:complexType name="TStartInfoCalcZoneViewForArea">
   <xs:sequence>
      <xs:element minOccurs="0" name="ID" type="xs:int"/>
      <xs:element minOccurs="0" name="startFreq" type="xs:double"/>
      <xs:element minOccurs="0" name="endFreq" type="xs:double"/>
      <xs:element minOccurs="0" name="startTime" type="xs:string"/>

这是c#的一部分

public partial class TStartInfoCalcZoneViewForArea


    private int idField;

    private bool idFieldSpecified;

    private double startFreqField;

    private bool startFreqFieldSpecified;

    private double endFreqField;

    private bool endFreqFieldSpecified;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order=0)]
public int ID

    get
    
        return this.idField;
    
    set
    
        this.idField = value;
    


/// <remarks/>
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool IDSpecified

    get
    
        return this.idFieldSpecified;
    
    set
    
        this.idFieldSpecified = value;
    

我为此字段设置了值。例如

.ID = 100;
.IDSpecified = true; // I set nothing, false. But result is same.

问题在于 gsoap 服务器中的所有这些字段(ID、endFreq、startFreq)都是空的。

这个问题的原因是什么?我该如何解决?

更新——原因及解决办法

问题是:我没有“gsoap 服务器”的源代码。但是根据我们公司的协议,我们使用(可以观看)来自该应用程序的日志。此日志不正确(首先,此情况下没有日志消息。然后此消息不正确。修复后问题解决)。

还有很多带有“双”字段的类和结构。因此,在某些类的实例中,我设置了“...Specified = true;”。在另一种情况下,我没有设置“...Specified = true;”。修复日志后,我看到了问题。

所以我需要设置“...Specified = true;”在所有课程中。我不知道这个解决方案是否正确,因为

1)我问了我们公司的另一个程序员,但他们不知道wcf正常。

2) 设置“...Specified = true;”,但我在日志中看到相同的消息。

【问题讨论】:

【参考方案1】:

问题是这样的:你的字段idField 的类型是int,所以在.NET 中,它不能为空——它总是必须有一个有效的整数值,例如0.

另一方面,XML 模式将其定义为可选:

<xs:element minOccurs="0" name="ID" type="xs:int"/>

因此,.NET 客户端无法知道您的 idField 中的 0 值是否意味着没有定义值(因为它有一个 minOccurs=0),或者您是否真的要发送值0 到服务器。

这就是idFieldSpecified 发挥作用的地方:

如果idField0 并且idFieldSpecifiedfalse --> 那么没有值 被定义(例如有点像SQL 中的NULL

如果 idField0 并且 idFieldSpecifiedtrue --> 那么你真的想将 0 值发送给调用者

因此,如果您的字段附带 (field)Specified 字段,如果您想实际发送一个值,那么您必须(field)Specified 值设置为 true - 否则设置的值发送。

【讨论】:

谢谢。我的问题是我设置了所有值。 ID = 100 开始频率 = 1500 结束频率 = 2500;但在 gsoap 应用程序中,此字段为空(其他字段很好) @novicegis: 并且你设置他们随附的....specified 字段为TRUE ????如果您不将这些字段设置为 TRUE,那么您的值 不会 序列化到消息中! 好吧,那么gsoap 系统可能与您发送的那些 SOAP 消息有一些问题...... 您是否尝试设置WCF Message Logging 以便查看发送到gsoap 的消息? 这是一个糟糕的设计。为什么 WCF 看不到 minOccurs="0" 而是生成 Nullable&lt;int&gt;

以上是关于为啥带有附加字段“指定”的字段始终为空?的主要内容,如果未能解决你的问题,请参考以下文章

与附加字段的一对多关系

Android Room - 带有附加字段的多对多关系

在您键入时附加带有转换字符的输入字段,JQUERY

自动生成的 WCF 代码具有布尔值,具有“指定”附加字段

错误:时间戳字段的架构已更改(附加)

SQL UPDATE 带有附加字符串 CONCAT 的字段中的所有值不起作用