xsd生成器到C#/ protobuf

时间:2012-12-20 20:45:54

标签: c# serialization protobuf-net

我正在开发一个通过网络序列化和反序列化消息的应用程序。但是我遇到了使用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;
        }
    }

1 个答案:

答案 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 {}
}

但仍需要维护这一点,以包括您需要序列化的成员。