2012-03-25 2 views
0

ImtoをNetDataContractSerializer(またはBinarySerializer)としてProtoBuf.Netを使用してPOCします。 ここにコードを投稿しましたcode。 試行錯誤していて、List、Dictionaryなどではまだ動作しません。 間違った方向に入っているようです。 これは実現可能ですか?ProtoBuf.Net - TypeFormatterとしてProtoを使用します。

フィードバックは高く評価されます。

+0

事前に候補ルートタイプの完全なセットがわかっていますか?または、完全に未知の型をシリアル化するつもりですか? –

+0

は事前に知られていますが、タイプは、シリアル化とデシリアライズの両方で知られています – eyan

答えて

0

私はProtobuf.netを使用している、と私はこのように私のクラスをマークすることによって、それをやった:

namespace music 
    { 
     [ProtoContract] 
     public class Album 
     { 
      [ProtoMember(1)] 
      public string Name { get; set; } 

      [ProtoMember(2)] 
     public List<string> TrackList { get; set; } 
     } 
    } 

これも辞書やリストのために動作します。

同じ番号の規則は、.proto・メッセージ・ファイルを使用すると、属性に適用されますが、あなたは、このような基底クラスのプロパティを含めることができます。

[ProtoContract] 
[ProtoInclude(10, typeof(TypeInheritingFromPerson))] 
[ProtoInclude(11, typeof(AnotherTypeInheritingFromPerson))] 
public abstract class Person 
{ 
    [DataMember] 
    [ProtoMember(1)] 
    public string Name { get; set; } 
... 

、その後、シリアライズのコード行を使用した:

もちろん利用FILESTREAMの代わりに、メモリストリーム:)

のことができます

MemoryStream stream = new MemoryStream(); 
    ProtoBuf.Serializer.Serialize<Album>(stream, album); 

あなたはWCFを使用している場合は、のためにDataContractSerializerを入れ替えることができますProtobufシリアライザをこのような設定ファイル(protobuf.netのドキュメントから貼り付けられたコピー)に直接入れるため、シリアル化コードを手動で呼び出す必要はありません。

system.serviceModelセクション:

  <behaviors> 
      <endpointBehaviors> 
      <behavior name="ProtoBufBehaviorConfig"> 
       <ProtoBufSerialization/> 
      </behavior> 
      </endpointBehaviors> 
     </behaviors> 
     <extensions> 
      <behaviorExtensions> 
      <add name="ProtoBufSerialization" type="ProtoBuf.ServiceModel.ProtoBehaviorExtension, protobuf-net, Version=1.0.0.255, Culture=neutral, PublicKeyToken=257b51d87d2e4d67"/> 
      </behaviorExtensions> 
     </extensions> 

は、次のようにbehaviorConfigurationを持っているあなたのエンドポイントを設定します。

  <service name="TK.Framework.Samples.ServiceModel.Contract.SampleService"> 
      <endpoint address="http://myhost:9003/SampleService" binding="basicHttpBinding" behaviorConfiguration="ProtoBufBehaviorConfig" 
      bindingConfiguration="basicHttpBindingConfig" name="basicHttpProtoBuf" contract="ISampleServiceContract" /> 
     </service> 
     <client> 
      <endpoint address="http://myhost:9003/SampleService" binding="basicHttpBinding" 
       bindingConfiguration="basicHttpBindingConfig" contract="ISampleServiceContract" 
       name="BasicHttpProtoBufEndpoint" behaviorConfiguration="ProtoBufBehaviorConfig"/> 
      </client> 

私はこれがあなたのために有用であると思いますが、ご質問、または何かを持っているなら、私に知らせては不明です:)

+0

私はProtobuf.NetV2を使用し、実行時登録(コードが添付されています)を使用しています。リストやディクショナリを直列化することはできません。リスト/ディクショナリをシリアル化するためにProtobufが使用しているものは見当たりませんそのメンバーは原属性でマークされていません。 – eyan

+1

データ/クラス構造はどのように見えますか?あなたはprotobuf属性で飾ることができないタイプを使用していますか? – Franchesca

+0

hmm ... ProtoBuf.Meta名前空間で利用できるものを見ましたか? – Franchesca

関連する問題