Protobuf Net Silverlight:DataContract类的属性为null或缺失
这是我在WCF服务中使用的DLL中的类定义之一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?
[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 { }
}