@@ -9,45 +9,24 @@ type ClusterSerializer{I<:IO} <: AbstractSerializer
9
9
counter:: Int
10
10
table:: ObjectIdDict
11
11
12
- sent_objects:: Dict {UInt64, Bool } # used by serialize (track objects sent)
12
+ sent_objects:: Set {UInt64} # used by serialize (track objects sent)
13
13
14
- ClusterSerializer (io:: I ) = new (io, 0 , ObjectIdDict (), Dict ())
14
+ ClusterSerializer (io:: I ) = new (io, 0 , ObjectIdDict (), Set {UInt64} ())
15
15
end
16
16
ClusterSerializer (io:: IO ) = ClusterSerializer {typeof(io)} (io)
17
17
18
18
function deserialize (s:: ClusterSerializer , :: Type{TypeName} )
19
- number, full_body_sent = deserialize (s)
20
- makenew = false
21
- known = haskey (known_object_data, number)
19
+ full_body_sent = deserialize (s)
22
20
if ! full_body_sent
23
- if ! known
24
- error (" Expected object in cache. Not found." )
25
- else
26
- tn = known_object_data[number]:: TypeName
21
+ number = read (s. io, UInt64)
22
+ tn = get (known_object_data, number, nothing ):: TypeName
23
+ if ! haskey (object_numbers, tn)
24
+ # setup reverse mapping for serialize
25
+ object_numbers[tn] = number
27
26
end
27
+ deserialize_cycle (s, tn)
28
28
else
29
- name = deserialize (s)
30
- mod = deserialize (s)
31
- if known
32
- tn = known_object_data[number]:: TypeName
33
- elseif mod != = __deserialized_types__ && isdefined (mod, name)
34
- tn = getfield (mod, name). name
35
- # TODO : confirm somehow that the types match
36
- # warn(mod, ".", name, " isdefined, need not have been serialized")
37
- name = tn. name
38
- mod = tn. module
39
- else
40
- name = gensym ()
41
- mod = __deserialized_types__
42
- tn = ccall (:jl_new_typename_in , Ref{TypeName}, (Any, Any), name, mod)
43
- makenew = true
44
- end
45
- end
46
- deserialize_cycle (s, tn)
47
- full_body_sent && deserialize_typename_body (s, tn, number, name, mod, makenew)
48
- ! known && (known_object_data[number] = tn)
49
- if ! haskey (object_numbers, tn)
50
- object_numbers[tn] = number
29
+ tn = invoke (deserialize, (AbstractSerializer, Type{TypeName}), s, TypeName)
51
30
end
52
31
return tn
53
32
end
@@ -57,15 +36,18 @@ function serialize(s::ClusterSerializer, t::TypeName)
57
36
writetag (s. io, TYPENAME_TAG)
58
37
59
38
identifier = object_number (t)
60
- if ! haskey (s. sent_objects, identifier)
61
- serialize (s, (identifier, true ))
39
+ if ! (identifier in s. sent_objects)
40
+ serialize (s, true )
41
+ write (s. io, identifier)
62
42
serialize (s, t. name)
63
43
serialize (s, t. module)
64
44
serialize_typename_body (s, t)
65
- s. sent_objects[identifier] = true
45
+ push! ( s. sent_objects, identifier)
66
46
# println(t.module, ":", t.name, ", id:", identifier, " sent")
67
47
else
68
- serialize (s, (identifier, false ))
48
+ serialize (s, false )
49
+ write (s. io, identifier)
69
50
# println(t.module, ":", t.name, ", id:", identifier, " NOT sent")
70
51
end
52
+ nothing
71
53
end
0 commit comments