1

私はいくつかの自然言語処理コードを書いており、単語の意味を検索するためのバイナリ形式の辞書が必要です。私は当初、標準のシリアライゼーションとバイナリ フォーマッタのメカニズムを使用していましたが、結果として得られるファイルがいかに大きく、(冗長な) 型情報でいっぱいであるかにぞっとしました。protobuf-net ライブラリを機能させようとしていますが、次の問題があります。

辞書をファイルに書き込むとき、レコードの開始位置のオフセットもインデックス ファイルに入れます。シリアル化は問題なく機能すると思いますが、エントリを調べると正しいオフセットが得られますが、DictionaryEntry の Definitions プロパティにはすべてのそれ以降の DictionaryDefinitions (数千)。List の最初の DictionaryDefinition は、検索対象の用語の正しい定義です。

これをプロパティとパブリック メンバーの両方として実装しようとしましたが、成功しませんでした。また、ProtoContract 属性で 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

4

1 に答える 1

2

生の protobuf 形式には、長さのプレフィックスもターミネータもありません。append === マージするように設計されています。

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

于 2012-04-07T19:39:48.840 に答える