Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Protobuf Net Silverlight:DataContract类的属性为null或缺失_Silverlight_Properties_Null_Wsdl_Protocol Buffers - Fatal编程技术网

Protobuf Net Silverlight:DataContract类的属性为null或缺失

Protobuf Net Silverlight:DataContract类的属性为null或缺失,silverlight,properties,null,wsdl,protocol-buffers,Silverlight,Properties,Null,Wsdl,Protocol Buffers,这是我在WCF服务中使用的DLL中的类定义之一 [DataContract] public class ScenarioXML { [DataMember(Order = 1)] public long? TNRScenario { get; set; } [DataMember(Order = 2)] public long? TNRProject { get; set; } [DataMember(Order = 3)] public int?

这是我在WCF服务中使用的DLL中的类定义之一

[DataContract]
public class ScenarioXML
{
    [DataMember(Order = 1)]
    public long? TNRScenario { get; set; }
    [DataMember(Order = 2)]
    public long? TNRProject { get; set; }
    [DataMember(Order = 3)]
    public int? Priority { get; set; }        
    // ...
    [DataMember(Order = 19)]
    public List<ScenarioAssetXML> ScenarioAssets { get; set; }
    [DataMember(Order = 20)]
    public List<CalendarXML> Calendars { get; set; }
    [DataMember(Order = 21)]
    public ScenarioTriggerCollectionXML ScenarioTriggerCollection { get; set; }
}
当我将第一个属性设置为字符串时,它在(反)序列化后完全消失。当我将一个伪bool作为第一个属性时,bool在那里,但是第二个属性,在本例中是ScenarioAssets,仍然为null。这里发生了一些奇怪的事情

我做错什么了,还是这是一个错误

编辑: 你说得对,马克!在WSDL生成的代码中,这些命令会被打乱

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="ScenarioXML", Namespace="http://schemas.datacontract.org/2004/07/DataCollectionDLL")]
public partial class ScenarioXML : object, System.ComponentModel.INotifyPropertyChanged {

    private System.Nullable<long> TNRScenarioField;

    private System.Nullable<long> TNRProjectField;

    private System.Nullable<int> PriorityField;

    //...

    [System.Runtime.Serialization.DataMemberAttribute()]
    public System.Nullable<long> TNRScenario {
        get {
            return this.TNRScenarioField;
        }
        set {
            if ((this.TNRScenarioField.Equals(value) != true)) {
                this.TNRScenarioField = value;
                this.RaisePropertyChanged("TNRScenario");
            }
        }
    }

    [System.Runtime.Serialization.DataMemberAttribute(Order=1)]
    public System.Nullable<long> TNRProject {
        get {
            return this.TNRProjectField;
        }
        set {
            if ((this.TNRProjectField.Equals(value) != true)) {
                this.TNRProjectField = value;
                this.RaisePropertyChanged("TNRProject");
            }
        }
    }

    [System.Runtime.Serialization.DataMemberAttribute(Order=2)]
    public System.Nullable<int> Priority {
        get {
            return this.PriorityField;
        }
        set {
            if ((this.PriorityField.Equals(value) != true)) {
                this.PriorityField = value;
                this.RaisePropertyChanged("Priority");
            }
        }
    }
    //...

听起来您使用了WSDL生成的代理;这可能会让事情变得有点混乱,因为protobuf net确实关心数字是什么,WSDL有时会对这些数字进行快速和松散的处理。如果我能看到WSDL生成的代理类(在
.designer.cs
中),这将非常有帮助,但我假设这就是问题所在。幸运的是,大多数代码生成器使用
部分类
,因此您可以在单独的文件中添加自己的
部分类
,以向相同类型中添加额外信息,特别是:更多属性。例如:

namespace The.Same.Namespace
{
    [ProtoContract]
    [ProtoPartialMember(1, "TNRScenario")]
    [ProtoPartialMember(2, "TNRProject")]
    // ...
    [ProtoPartialMember(21, "ScenarioTriggerCollection")]
    partial class ScenarioXML { }
}

这将被编译器合并到
ScenarioXML
类中,并应允许protobuf net为每个属性使用正确的数字标识符。

在原始帖子中添加我的回复。。。字符不足;)
分部类
文件需要与.designer.cs放在同一个项目中-是这样吗?另外,如果它们只是一个,有一种方法可以简化它。你是说哪个.designer.cs文件。。。?我的项目文件夹中有一堆.designer.cs文件,但它们都与资源文件相关。。。我不知道哪个.designer.cs文件与WSDL生成的代码有关?我上面发布的ScenarioXML类定义隐藏在“服务引用”下的某个“reference.cs”文件中。
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="ScenarioXML", Namespace="http://schemas.datacontract.org/2004/07/DataCollectionDLL")]
public partial class ScenarioXML : object, System.ComponentModel.INotifyPropertyChanged {

    private System.Nullable<long> TNRScenarioField;

    private System.Nullable<long> TNRProjectField;

    private System.Nullable<int> PriorityField;

    //...

    [System.Runtime.Serialization.DataMemberAttribute()]
    public System.Nullable<long> TNRScenario {
        get {
            return this.TNRScenarioField;
        }
        set {
            if ((this.TNRScenarioField.Equals(value) != true)) {
                this.TNRScenarioField = value;
                this.RaisePropertyChanged("TNRScenario");
            }
        }
    }

    [System.Runtime.Serialization.DataMemberAttribute(Order=1)]
    public System.Nullable<long> TNRProject {
        get {
            return this.TNRProjectField;
        }
        set {
            if ((this.TNRProjectField.Equals(value) != true)) {
                this.TNRProjectField = value;
                this.RaisePropertyChanged("TNRProject");
            }
        }
    }

    [System.Runtime.Serialization.DataMemberAttribute(Order=2)]
    public System.Nullable<int> Priority {
        get {
            return this.PriorityField;
        }
        set {
            if ((this.PriorityField.Equals(value) != true)) {
                this.PriorityField = value;
                this.RaisePropertyChanged("Priority");
            }
        }
    }
    //...
namespace DataCollectionDLL
{
    [ProtoContract]
    [ProtoPartialMember(1, "TNRScenario")]
    [ProtoPartialMember(2, "TNRProject")]
    [ProtoPartialMember(3, "Priority")]
    //...
    [ProtoPartialMember(21, "ScenarioTriggerCollection")]
    partial class ScenarioXML
    {
    }
}
namespace The.Same.Namespace
{
    [ProtoContract]
    [ProtoPartialMember(1, "TNRScenario")]
    [ProtoPartialMember(2, "TNRProject")]
    // ...
    [ProtoPartialMember(21, "ScenarioTriggerCollection")]
    partial class ScenarioXML { }
}