2

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

1 回答 1

0

protobuf-net 可以尝试使用来自其他库的属性,但前提是它们提供了足够的信息。特别是,protocol buffers 要求每个成员有一个正整数标识符(它可以尝试从中获取Order),但是:[XmlAttribute] 没有Order,并且 xsd 令人讨厌地启动Orderfrom ,它不能0被 protocol buffers 使用(它不是一个有效的字段标识符)。

最终,这可能不适合来自 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 {}
}

不过,这仍然需要维护以包含您需要序列化的成员。

于 2012-12-21T08:12:13.920 回答