我正在开发一个通过网络序列化和反序列化消息的应用程序。但是我遇到了使用xsd从xsd架构生成的C#类的问题。
我能够使用自己的测试类成功测试protobuf库。安装lib并使用必要的protobuf属性(包括整数顺序)来装饰我的类。
我从文档中了解到protobuf尊重现有的序列化属性,如xmltype,datacontract等。当我运行xsdgen工具时,我的类使用这些属性进行修饰,但序列化过程没有发生。
我尝试创建一个部分类,但如果我有很多课程并且课程不断变化,它仍然非常手动。
这是我的xsd命令[xsd TopClass.xsd / c / eld / edb / n:MyNamespace / order]
有人可以推荐一个解决方案吗?
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlRootAttribute("safHeartBeat", Namespace="", IsNullable=false)]
public partial class SaFHeartBeat {
private System.DateTime timestampField;
private string cacheNameField;
private string hostnameField;
private System.DateTime processStartTimeField;
private SafStatusEnum statusField;
private object datatypeField;
private int itemCountField;
private System.DateTime lastUpdateTimeField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order=0)]
public System.DateTime timestamp {
get {
return this.timestampField;
}
set {
this.timestampField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order=1)]
public string cacheName {
get {
return this.cacheNameField;
}
set {
this.cacheNameField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order=2)]
public string hostname {
get {
return this.hostnameField;
}
set {
this.hostnameField = value;
}
}
答案 0 :(得分:0)
protobuf-net可以尝试来使用其他库中的属性,但只有当它们提供足够的信息时。特别是,协议缓冲区每个成员需要一个正整数标识符(它可以尝试从Order
获取),但是:[XmlAttribute]
有没有Order
,并且xsd恼人地从Order
开始0
,协议缓冲区不能使用它{(它不是有效的字段标识符)。
最终,这可能不适合正在进行/更改xsd的定义;我很想说“稍后为protobuf写一个单独的DTO”。但是,另一种选择是生成第二个partial
类文件,并装饰 ,例如:
namespace MyNamespace {
[ProtoContract]
[ProtoPartialMember(1, "Id"), ProtoPartialMember(2, "Name")]
partial class SomeType {}
[ProtoContract]
[ProtoPartialMember(1, "Id"), ProtoPartialMember(2, "Date")]
[ProtoPartialMember(3, "Value"), ProtoPartialMember(4, "Origin")]
partial class SomeOtherType {}
}
但仍需要维护这一点,以包括您需要序列化的成员。