Clojure

Add transient keyword to cached toString() value in _str

Details

  • Type: Defect Defect
  • Status: Open Open
  • Priority: Minor Minor
  • Resolution: Unresolved
  • Affects Version/s: Release 1.6
  • Fix Version/s: Release 1.7
  • Component/s: None
  • Labels:
  • Patch:
    Code
  • Approval:
    Incomplete

Description

_str field in Keyword and Symbol classes lazily caches result of toString(). Because this field is not transient, serializing (using Java serialization) any keyword before and after calling toString() for the first time yields different results:

(import (java.io ByteArrayOutputStream ObjectOutputStream
                 ByteArrayInputStream  ObjectInputStream))

(defn- serialize [obj]
  (with-open [bos (ByteArrayOutputStream.)
              stream (ObjectOutputStream. bos)]
    (.writeObject stream obj)
    (-> bos .toByteArray seq)))

(def s1 (serialize :k))
;(println :k)
(def s2 (serialize :k))
(println (= s1 s2))

Uncomment (println :k) and suddenly s1 and s2 are no longer equal.

This issue came up when I was trying to use keywords as key in [Hazelcast](https://github.com/hazelcast/hazelcast) map. Hazelcast uses serialized keys in various scenarios, thus if I first put something to map under key :k and then print :k, I can no longer find such key.

Patch: CLJ-1408-2.patch

Screened by:

  1. CLJ-1408-2.patch
    09/May/14 3:55 PM
    1 kB
    Tomasz Nurkiewicz
  2. CLJ-1408.patch
    19/Apr/14 4:53 AM
    1 kB
    Tomasz Nurkiewicz

Activity

Hide
Alex Miller added a comment -

Hi Tomasz, it would be good to fix this, can you sign the CLA?

Show
Alex Miller added a comment - Hi Tomasz, it would be good to fix this, can you sign the CLA?
Hide
Tomasz Nurkiewicz added a comment -

Thanks, I'll sign and send CLA ASAP.

Show
Tomasz Nurkiewicz added a comment - Thanks, I'll sign and send CLA ASAP.
Hide
Tomasz Nurkiewicz added a comment -

My contributor greement arrived, please merge this patch whenever you find suitable.

Show
Tomasz Nurkiewicz added a comment - My contributor greement arrived, please merge this patch whenever you find suitable.
Hide
Alex Miller added a comment -

Hi Tomasz, I noticed you added the private keyword - please remove that and update the patch.

Show
Alex Miller added a comment - Hi Tomasz, I noticed you added the private keyword - please remove that and update the patch.
Hide
Tomasz Nurkiewicz added a comment -

Removed `private` keyword

Show
Tomasz Nurkiewicz added a comment - Removed `private` keyword
Hide
Alex Miller added a comment -

On second thought, it looks like we have most of the infrastructure for serialization testing anyways, so would appreciate an updated patch with the example turned into a serialization test. Please see test/clojure/test_clojure/serialization.clj for a place to put this (using existing roundtrip function).

Show
Alex Miller added a comment - On second thought, it looks like we have most of the infrastructure for serialization testing anyways, so would appreciate an updated patch with the example turned into a serialization test. Please see test/clojure/test_clojure/serialization.clj for a place to put this (using existing roundtrip function).

People

Vote (0)
Watch (2)

Dates

  • Created:
    Updated: