2017-02-15 4 views
1

I map.containsKey()が明確に動作しない、次のマップ定義があります:私はクロニクル地図2.4.17を使用し、それがに移行するにはあまりにも難しいクロニクル地図2のcontainsKeyは動作しません

ChronicleMapBuilder<String, String> cmBuilder = ChronicleMapBuilder.of(String.class, String.class); 
cmBuilder.constantKeySizeBySample("abcde") 
     .averageValueSize(128) 
     .entries(1024) 
     .keyMarshaller(new MyStringMarshaller()) 
     .valueMarshaller(new MyStringMarshaller()); 
Map myMap = cmBuilder.createPersistedTo(new File("/tmp/test-map")); 
myMap.put("abc", "123"); 
System.out.println(myMap.containsKey("abc")); // prints false 

... 

public static class MyStringMarshaller implements BytesMarshaller<String> { 
    @Override 
    public void write(Bytes bytes, String str) { 
     bytes.writeUTF(str); 
    } 

    @Override 
    public String read(Bytes bytes) { 
     return read(bytes, null); 
    } 

    @Override 
    public String read(Bytes bytes, String str) { 
     return bytes.readUTF(); 
    } 
} 

を私のプロジェクトのバージョン3。

キー "abc"でエントリを入力した直後のcontainsKey()メソッドは、キー "abc"に対してfalseを返します。なぜうまくいかないのか分かりません。 String型は、正しいhashCode()メソッドを持つデフォルトのJava文字列です。

答えて

1

文字列を含むクロニクルマップを作成するだけの場合は、keyMarshallerを使用する必要はありません。しかし、これはあなたが求めている質問なので、MyStringMarshallerをStringMarshallerのインスタンスに置き換えて、これのソースコードを参照することをお勧めします。https://github.com/OpenHFT/Java-Lang/blob/master/lang/src/main/java/net/openhft/lang/io/serialization/impl/StringMarshaller.java

+0

まだ動作しません:http://pastebin.com/4ivAH2dK I何かを見逃しています... – Soid

+1

あなたがしたいことがあれば、私はあなたに見せることができるマップを作るための簡単な方法があるので、あなたはChronicleMap を作成しようとしていますか?別の理由でKeyMarshallerを使用する –

+0

私はconstantKeySizeBySample()およびaverageValueSize()を使用しないと、それが機能することを発見しました。これは、CM 2.xの1年間公開されているこの問題に関連する可能性があります。https://github.com/OpenHFT/Chronicle-Map/issues/86 – Soid

関連する問題