2017-02-15 2 views
1

У меня есть следующее определение карты, где map.containsKey() явно не работает:хроники Карта 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(); 
    } 
} 

Я использую Chronicle Карта 2.4.17 и это слишком сложно перейти на версия 3 в моем проекте.

Сразу после ввода записи с ключом «abc» метод containsKey() возвращает false для ключа «abc». Я смущен, почему это не сработает. Строковый тип - это строка Java по умолчанию, которая имеет правильный метод hashCode().

ответ

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 'm missing something ... – Soid

+1

вы просто хотите создать ChronicleMap , потому что если это все, что вы хотите сделать, есть более простые способы построения карты, которую я могу вам показать, или у вас есть использовать KeyMarshaller по другой причине –

+0

Я обнаружил, что если я не использую константуKeySizeBySample() и averageValueSize(), чем это работает. Это может быть связано с этой проблемой, которая была открыта в течение года для CM 2.x: https://github.com/OpenHFT/Chronicle-Map/issues/86 – Soid