繁体   English   中英

XSD生成器到C#/ protobuf

[英]xsd generator to C#/protobuf

我正在开发一个应用,该应用通过网络对消息进行序列化和反序列化。 但是我在使用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;
        }
    }

protobuf-net可以尝试使用其他库中的属性,但前提是它们必须提供足够的信息。 特别地,协议缓冲区需要每个部件(它可以尝试从得到的正整数标识符Order ),但是: [XmlAttribute] 没有 Order ,和xsd烦人启动Order0 ,这是不能由协议缓冲区被用来(它不是有效的字段标识符)。

最终,这可能不适用于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 {}
}

不过,仍然需要维护它以包括需要序列化的成员。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM