2012-04-07 16 views
1

私は自然言語処理コードをいくつか書いており、単語の意味を調べるためのバイナリ形式の辞書を用意したいと考えています。私はもともと標準のシリアライゼーションとバイナリフォーマッタの仕組みを使っていましたが、結果として得られるファイルの大きさと(冗長な)タイプ情報がどれくらいいっぱいであるかを驚かせました。私はprotobuf-netライブラリを私のために働かせようとしていましたが、次の問題があります:protobuf-netクラスを逆シリアル化するリスト<T>プロパティ/メンバー

辞書にファイルを書き込むと、インデックスファイルにレコードが始まるというオフセットがあります。シリアライゼーションはうまくいきますが、エントリを見ると正しいオフセットが得られますが、DictionaryEntryのDefinitionsプロパティにはDictionaryDefinitionsがすべて含まれています(何千ものもの)。リスト内の最初のDictionaryDefinitionは、検索された用語の正しいDictionaryDefinitionです。

私はこれを、プロパティとしてもパブリックメンバーとしても、成功しないように実装しようとしました。 ProtoContember属性ではSkipConstructor = true、ProtoMember属性ではOverwriteList = trueを試してみました。

[ProtoContract] 
public class DictionaryEntry 
{ 
    [ProtoMember(1)] 
    public string EntryKey { get; set; } 
    [ProtoMember(2)] 
    public List<DictionaryDefinition> Definitions{ get; set; } 
} 

[ProtoContract] 
public class DictionaryDefinition 
{ 
    [ProtoMember(1)] 
    public string PartOfSpeech { get; set; } 
    [ProtoMember(2)] 
    public string Definition { get; set; } 
} 

私は自分のコードの残りの部分で特にダム何かをやったとは思わないが、誰もが、この部分のために何を示唆することができれば、私はこれを除外したいと思います。

おかげで、

M

+0

分割する必要がある既存のデータがある場合は、おそらくそれを助けることができます。オフセットがある場合はおそらくその必要はありません –

+0

実際には、技術的には、 *オフセットデータを使用して、手動で長さを指定できるオーバーロードを使用して既存のデータを逆シリアル化してください –

答えて

2

は、生のいるProtobuf形式は長さプレフィックスないターミネータもない - そのようなことAPPENDは===マージ設計されています。

単一のストリーム内の個々のオブジェクトを識別する必要がある場合は、シリアル化/逆シリアル化に* WithLengthPrefixメソッドを使用します。これにより、ストリームから個々の要素を確実に選択することができます。

+0

あなたの応答をありがとうございました。私はあなたの献身に驚き、あなたの助けに感謝します。私はSerializer.SerializeWithLengthPrefix(file、dictionaryEntry、PrefixStyle.Base128)を使用しました。それは魅力のように働いた。 – mintydog

関連する問題