私は、FastInfoSet を使用するだけでなく、それを外部語彙と共に使用することの素晴らしいスペース エコノミーに関する Sun の人々の主張を読みました。この目的のコードは最新バージョン (1.2.8) に含まれていますが、完全に文書化されているわけではありません。
多くのファイルでは、これは私にとってはうまく機能します。しかし、私が作成した語彙 (FI ライブラリのジェネレーターを使用) を使用して DOM からシリアライズし、DOM に読み戻すと、不一致になる XML ファイルが作成されました。不一致はすべて PC データにあります。
シリアライザーで setVocabulary を呼び出し、リーダーで URI から語彙へのマップを使用して setExternalVocabulary を呼び出すだけです。
ボキャブラリを実際にシリアライズするには、独自のメカニズムを考案する必要がありました。FI ライブラリのどこにもないようです。
ちょっと厄介な問題の 1 つは、org.jvnet.fastinfoset.Vocabulary クラスはジェネレーターが提供するものですが、パーサーとシリアライザーが食べるものではないということです。これらをシリアル化し、以下のコードを使用してそれらを必要なオブジェクトに変換するように手配しました。
private static void initializeAnalysis() {
InputStream is = FastInfosetUtils.class.getResourceAsStream(ANALYSIS_VOCAB_CLASSPATH);
try {
ObjectInputStream ois = new ObjectInputStream(is);
analysisJvnetVocab = (SerializableVocabulary) ois.readObject();
ois.close();
} catch (IOException e) {
throw new RuntimeException(e);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
analysisSerializerVocab = new SerializerVocabulary(analysisJvnetVocab.getVocabulary(), false);
analysisParserVocab = new ParserVocabulary(analysisJvnetVocab.getVocabulary());
}
そして、実際に文書を書くには:
SerializerVocabulary fullVocab = new SerializerVocabulary();
fullVocab.setExternalVocabulary(ANALYSIS_VOCAB_URI, analysisSerializerVocab, false);
// pass fullVocab to setVocabulary.
そして読むために:
Map<Object, Object> vocabMap = new HashMap<Object, Object>();
vocabMap.put(ANALYSIS_VOCAB_URI, analysisParserVocab);
// pass map into setExternalVocabulary
シリアライゼーション語彙を作成するためのレシピが正しくないことは容易に想像できます。チュートリアルを読んでいたわけではありません。たまたま知ってる人いますか?
アップデート
ここでは誰もこの質問に追加するものがなかったので、テスト ケースを作成し、バグ レポートを提出しました。少し驚いたことに、これは実際にはバグであり、修正が行われたことが判明しました。