When deserializing Dictionary objects, it looks like they are being rehashed. Where and why is this happening?
dict1 := Dictionary new. 1 to: 1000 do: [:e | dict1 at: e put: e].
rep1 := ReferenceStream streamedRepresentationOf: dict1. dict2 := ReferenceStream unStream: rep1. rep2 := ReferenceStream streamedRepresentationOf: dict2.
dict1 = dict2. " true " rep1 = rep2. " false "
dict1 array size. " 2560 " dict2 array size. " 1334 "
dict1 rehash. dict1 array size. " 1334 "
I'm using ReferenceStreams to store object graphs in a relational database as a BLOB using Glorp. Glorp determines whether to do an updated by comparing the serialized form of objects with their last state. This causes spurious UPDATEs.
Any ideas?
Thanks. Zulq.
On Wed, May 6, 2009 at 12:49 PM, Zulq Alam me@zulq.net wrote:
When deserializing Dictionary objects, it looks like they are being rehashed. Where and why is this happening?
I'm sorry I don't know where, but the why is because a deserialized Dictionary (or Set, or any hashed collection) will, if non-empty, contain newly created/deserialized objects whose identity hashes will differ from those of the serialized ones. Since Object>>#= defaults to #== and Object>>#hash defaults to #identityHash an equality-hashed collection still needs to be rehashed when deserialized since #= hashes can depend on identityHash.
dict1 := Dictionary new.
1 to: 1000 do: [:e | dict1 at: e put: e].
rep1 := ReferenceStream streamedRepresentationOf: dict1. dict2 := ReferenceStream unStream: rep1. rep2 := ReferenceStream streamedRepresentationOf: dict2.
dict1 = dict2. " true " rep1 = rep2. " false "
dict1 array size. " 2560 " dict2 array size. " 1334 "
dict1 rehash. dict1 array size. " 1334 "
I'm using ReferenceStreams to store object graphs in a relational database as a BLOB using Glorp. Glorp determines whether to do an updated by comparing the serialized form of objects with their last state. This causes spurious UPDATEs.
Any ideas?
Thanks. Zulq.
squeak-dev@lists.squeakfoundation.org