2011-11-17 2 views
5

簡単な実験:Northwindからエンティティモデルを作成し、生成されたクラスがOrderプロパティを追加せずにprotobuf-net v2で動作しないことがわかりました。エンティティコードジェネレータにOrderを追加する方法がありますか、またはOrderなしでprotobuf-netを動作させる方法がありますか?私はprotobuf-net v2でDataMember(Order = n)アノテーションが必要ですか?

[DataMemberAttribute(Order=1)]

[DataMemberAttribute()] 

を変更する必要が

など

NorthwindEntities e = new NorthwindEntities(); 

using(var file = File.Create("customers.bin")) 
{ 
    Serializer.Serialize(file, e.Customers); 
} 

答えて

13

何役立ちます希望は、それが数字キーにメンバーを解決するための方法を持っていることです。このとなります。たとえば、[DataContract]/[DataMember(Order=key)][XmlType]/[XmlElement(Order=key)]、または[ProtoContract]/[ProtoMember(key)]となります。

推論アルファベット順の契約に[DataContract]経由のオプションがありますが、あなたの契約種別がが将来を変更するつもりはないされている場合にのみ安全です。これを行うには、次のように追加してください:

[ProtoContract(InferTagFromName = true)] 

(おそらく部分的には、以下を参照してください)。これは、提示するシナリオに直接適用されます。[DataMember]はメンバーを示しますが、定義されているのはOrderです。個人的に私は安定性のために明示的なレイアウトを好みます。

別のオプションでも、[DataMember]のようなヒントは必要ありません。 BinaryFormatterルール(すべてのフィールド、パブリックまたはプライベート)、またはXmlSerializerルール(パブリックメンバー、プロパティまたはフィールド)のいずれかを適用するよう依頼できます。あなたのタイプが変わっても、非常にが不安定です。

[ProtoContract(ImplicitFields = ImplicitFields.AllPublic)] 

しかし、もう1つの一般的なシナリオは、ジェネレータからのタイプのもので、編集が簡単ではないことです。これは、編集が再生成時に失われるためです。 の場合はシナリオでは、partialクラスが役立ちます。属性を使用してメンバーに属性を追加することはできませんが、ここでは[ProtoPartialMember]が役に立ちます。例えば、別々のコードファイルで:

[ProtoContract] 
[ProtoPartialMember(key, memberName)] 
[ProtoPartialMember(anotherKey, anotherMemberName)] 
... 
public partial class Order {} 

時には、あなたはとてもオプションではありませんどのような種類の属性を追加し、型に一切アクセスを持っていません。あなたが説明するように、あなたのシナリオがある場合は([のDataContractは/ [DataMemberを] , no Order`)、その後、怠惰オプションは、グローバルに、これを有効にすることです:については

RuntimeTypeModel.Default.InferTagFromNameDefault = true; 

Serializer.GlobalOptions.InferTagFromName = true; 

またはv2で

RuntimeTypeModel.Default.Add(typeof(Order), false) 
      .Add(key, memberName).Add(anotherKey, anotherMemberName); 
:v2は、実行時にレイアウトを設定することができますこれに専念新しいMetaTypeモデルを、持っているより複雑なシナリオ、

またはあなたのキーがある場合は1、2、3、...そしてちょうど:

I

RuntimeTypeModel.Default.Add(typeof(Order), false) .Add(memberName, anotherMemberName, ...); 

(連載のすべての側面を制御するMetaType上の無数のオプションがあります)

ここのオプションのほとんどをカバーすると思うのは
だと思います!

+0

RuntimeTypeModel.Default.InferTagFromNameDefault = true;ありがとうございます。 –

+1

@Paulちょうど上記の強調に注意してください。それはアルファベット順であるため、メンバーが追加された場合** **安定していません。あなたが 'AardvarkCount'を追加すると、すべてのものが突然オフ・バイ・ワンになります –

1

私はちょうどいるProtobufに私のダイビングを開始しましたので、本当に見ていません以前のバージョンですが、生成されたストリームを見て、期待どおりの順序になっています。

<protocontract()> 
Public Class Peer 
    <ProtoMember(1)> 
    Public Property PacketNumber As Long 
    <ProtoMember(2)> 
    Public Property DateCreated As DateTime 
    <ProtoMember(3)> 
    Public Property Data As String 
    <ProtoMember(4)> 
    Public Property OriginatingTerminal As Integer 
end class 

これはを必要とする

+0

どのコード生成ツールを使用していますか? –

+0

現時点では、私はProtobufを既存のネットワーキングアプリケーションに導入しているので人間の手である –

関連する問題