2

私は、ネットワークを介してメッセージをシリアル化および逆シリアル化するアプリに取り組んでいます。しかし、xsdを使用してxsdスキーマから生成されたC#クラスに問題があります。

私は自分のテストクラスでprotobufライブラリを正常にテストすることができました。libをインストールし、整数の順序を含む必要なprotobuf属性でクラスを装飾します。

ドキュメントから、protobufはxmltype、datacontractなどの既存のシリアル化属性を尊重することがわかります。xsdgenツールを実行すると、クラスはこれらの属性で装飾されますが、シリアル化プロセスは実行されません。

部分的なクラスを作成しようとしましたが、クラスが多く、クラスが絶えず変化している場合は、それでもかなり手動でした。

これは私のxsdコマンドです[xsdTopClass.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 は、他のライブラリの属性を使用しようとすることができますが、十分な情報が提供されている場合に限ります。特に、プロトコル バッファはメンバーごとに正の整数識別子を必要とします (それは from を取得しようとすることができますOrder) が、:[XmlAttribute] なくOrder、xsd は厄介なことにOrderfrom0を開始します。これはプロトコル バッファでは使用できません (有効なフィールドではありません)。識別子)。

最終的に、これは xsd からの進行中/変更中の定義には適していない可能性があります。「後で protobuf 用に別の DTO を作成する」と言いたくなるでしょう。ただし、別のオプションは、2 番目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 に答える