Class: AMF::Pure::Serializer

Inherits:
Object
  • Object
show all
Includes:
WriteIOHelpers
Defined in:
lib/amf/pure/serializer.rb

Overview

AMF0 implementation of serializer

Instance Method Summary collapse

Methods included from WriteIOHelpers

#byte_order, #byte_order_little?, #pack_double, #pack_int16_network, #pack_int8, #pack_integer, #pack_word32_network

Constructor Details

#initializeSerializer

Returns a new instance of Serializer.



7
8
9
# File 'lib/amf/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/amf/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

#versionObject



11
12
13
# File 'lib/amf/pure/serializer.rb', line 11

def version
  0
end

#write_array(array, stream) ⇒ Object



81
82
83
84
85
86
87
88
# File 'lib/amf/pure/serializer.rb', line 81

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/amf/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



66
67
68
69
70
71
72
73
74
# File 'lib/amf/pure/serializer.rb', line 66

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



90
91
92
93
94
95
# File 'lib/amf/pure/serializer.rb', line 90

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/amf/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/amf/pure/serializer.rb', line 49

def write_number num, stream
  stream << AMF0_NUMBER_MARKER
  stream << pack_double(num)
end

#write_object(obj, stream) ⇒ Object



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/amf/pure/serializer.rb', line 97

def write_object obj, stream
  @ref_cache.add_obj obj

  # Is it a typed object?
  class_name = ClassMapper.get_as_class_name obj
  if class_name
    stream << AMF0_TYPED_OBJECT_MARKER
    stream << pack_int16_network(class_name.length)
    stream << class_name
  else
    stream << AMF0_OBJECT_MARKER
  end

  write_prop_list obj, stream
end

#write_reference(index, stream) ⇒ Object



76
77
78
79
# File 'lib/amf/pure/serializer.rb', line 76

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
# File 'lib/amf/pure/serializer.rb', line 54

def write_string str, stream
  len = str.length
  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