Class: RocketAMF::Pure::Serializer
- Inherits:
-
Object
- Object
- RocketAMF::Pure::Serializer
show all
- Includes:
- WriteIOHelpers
- Defined in:
- lib/rocketamf/pure/serializer.rb
Overview
AMF0 implementation of serializer
Instance Method Summary
collapse
#byte_order, #byte_order_little?, #pack_double, #pack_int16_network, #pack_int8, #pack_integer, #pack_word32_network
Constructor Details
Returns a new instance of Serializer.
7
8
9
|
# File 'lib/rocketamf/pure/serializer.rb', line 7
def initialize
@ref_cache = SerializerCache.new :object
end
|
Instance Method Details
#serialize(obj, stream = "") ⇒ Object
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
# File 'lib/rocketamf/pure/serializer.rb', line 15
def serialize obj, stream = ""
if obj.respond_to?(:to_amf)
stream << obj.to_amf(self)
elsif @ref_cache[obj] != nil
write_reference @ref_cache[obj], stream
elsif obj.is_a?(NilClass)
write_null stream
elsif obj.is_a?(TrueClass) || obj.is_a?(FalseClass)
write_boolean obj, stream
elsif obj.is_a?(Float) || obj.is_a?(Integer)
write_number obj, stream
elsif obj.is_a?(Symbol) || obj.is_a?(String)
write_string obj.to_s, stream
elsif obj.is_a?(Time)
write_date obj, stream
elsif obj.is_a?(Array)
write_array obj, stream
elsif obj.is_a?(Hash)
write_hash obj, stream
elsif obj.is_a?(Object)
write_object obj, stream
end
stream
end
|
#version ⇒ Object
11
12
13
|
# File 'lib/rocketamf/pure/serializer.rb', line 11
def version
0
end
|
#write_array(array, stream) ⇒ Object
82
83
84
85
86
87
88
89
|
# File 'lib/rocketamf/pure/serializer.rb', line 82
def write_array array, stream
@ref_cache.add_obj array
stream << AMF0_STRICT_ARRAY_MARKER
stream << pack_word32_network(array.length)
array.each do |elem|
serialize elem, stream
end
end
|
#write_boolean(bool, stream) ⇒ Object
44
45
46
47
|
# File 'lib/rocketamf/pure/serializer.rb', line 44
def write_boolean bool, stream
stream << AMF0_BOOLEAN_MARKER
stream << pack_int8(bool ? 1 : 0)
end
|
#write_date(date, stream) ⇒ Object
67
68
69
70
71
72
73
74
75
|
# File 'lib/rocketamf/pure/serializer.rb', line 67
def write_date date, stream
stream << AMF0_DATE_MARKER
date.utc unless date.utc?
seconds = (date.to_f * 1000).to_i
stream << pack_double(seconds)
stream << pack_int16_network(0)
end
|
#write_hash(hash, stream) ⇒ Object
91
92
93
94
95
96
|
# File 'lib/rocketamf/pure/serializer.rb', line 91
def write_hash hash, stream
@ref_cache.add_obj hash
stream << AMF0_HASH_MARKER
stream << pack_word32_network(hash.length)
write_prop_list hash, stream
end
|
#write_null(stream) ⇒ Object
40
41
42
|
# File 'lib/rocketamf/pure/serializer.rb', line 40
def write_null stream
stream << AMF0_NULL_MARKER
end
|
#write_number(num, stream) ⇒ Object
49
50
51
52
|
# File 'lib/rocketamf/pure/serializer.rb', line 49
def write_number num, stream
stream << AMF0_NUMBER_MARKER
stream << pack_double(num)
end
|
#write_object(obj, stream) ⇒ Object
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
# File 'lib/rocketamf/pure/serializer.rb', line 98
def write_object obj, stream
@ref_cache.add_obj obj
class_name = RocketAMF::ClassMapper.get_as_class_name obj
if class_name
class_name = class_name.encode("UTF-8").force_encoding("ASCII-8BIT") if class_name.respond_to?(:encode)
stream << AMF0_TYPED_OBJECT_MARKER
stream << pack_int16_network(class_name.bytesize)
stream << class_name
else
stream << AMF0_OBJECT_MARKER
end
write_prop_list obj, stream
end
|
#write_reference(index, stream) ⇒ Object
77
78
79
80
|
# File 'lib/rocketamf/pure/serializer.rb', line 77
def write_reference index, stream
stream << AMF0_REFERENCE_MARKER
stream << pack_int16_network(index)
end
|
#write_string(str, stream) ⇒ Object
54
55
56
57
58
59
60
61
62
63
64
65
|
# File 'lib/rocketamf/pure/serializer.rb', line 54
def write_string str, stream
str = str.encode("UTF-8").force_encoding("ASCII-8BIT") if str.respond_to?(:encode)
len = str.bytesize
if len > 2**16-1
stream << AMF0_LONG_STRING_MARKER
stream << pack_word32_network(len)
else
stream << AMF0_STRING_MARKER
stream << pack_int16_network(len)
end
stream << str
end
|