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

관련 문제