Class: Puppet::Pops::Serialization::Serializer
- Defined in:
- lib/puppet/pops/serialization/serializer.rb
Overview
The serializer is capable of writing, arrays, maps, and complex objects using an underlying protocol writer. It takes care of tabulating and disassembling complex objects.
Instance Attribute Summary collapse
-
#writer ⇒ Object
readonly
private
Provides access to the writer.
Instance Method Summary collapse
-
#finish ⇒ Object
Tell the underlying writer to finish.
-
#initialize(writer) ⇒ Serializer
constructor
A new instance of Serializer.
-
#start_array(size) ⇒ Object
private
Write the start of an array.
-
#start_map(size) ⇒ Object
private
Write the start of a map (hash).
-
#start_object(type_ref, attr_count) ⇒ Object
private
Write the start of a complex object.
-
#write(value) ⇒ Object
Write an object.
-
#write_tabulated_first_time(value) ⇒ Object
private
First time write of a tabulated object.
Constructor Details
#initialize(writer) ⇒ Serializer
Returns a new instance of Serializer.
15 16 17 18 |
# File 'lib/puppet/pops/serialization/serializer.rb', line 15 def initialize(writer) @written = {} @writer = writer end |
Instance Attribute Details
#writer ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Provides access to the writer.
11 12 13 |
# File 'lib/puppet/pops/serialization/serializer.rb', line 11 def writer @writer end |
Instance Method Details
#finish ⇒ Object
Tell the underlying writer to finish
22 23 24 |
# File 'lib/puppet/pops/serialization/serializer.rb', line 22 def finish @writer.finish end |
#start_array(size) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Write the start of an array.
48 49 50 |
# File 'lib/puppet/pops/serialization/serializer.rb', line 48 def start_array(size) @writer.write(Extension::ArrayStart.new(size)) end |
#start_map(size) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Write the start of a map (hash).
55 56 57 |
# File 'lib/puppet/pops/serialization/serializer.rb', line 55 def start_map(size) @writer.write(Extension::MapStart.new(size)) end |
#start_object(type_ref, attr_count) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Write the start of a complex object
63 64 65 |
# File 'lib/puppet/pops/serialization/serializer.rb', line 63 def start_object(type_ref, attr_count) @writer.write(Extension::ObjectStart.new(type_ref, attr_count)) end |
#write(value) ⇒ Object
Write an object
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'lib/puppet/pops/serialization/serializer.rb', line 29 def write(value) case value when Integer, Float, String, true, false, nil, Time @writer.write(value) when :default @writer.write(Extension::Default::INSTANCE) else index = @written[value.object_id] if index.nil? write_tabulated_first_time(value) else @writer.write(Extension::Tabulation.new(index)) unless index.nil? end end end |
#write_tabulated_first_time(value) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
First time write of a tabulated object. This means that the object is written and then remembered. Subsequent writes of the same object will yield a write of a tabulation index instead.
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/puppet/pops/serialization/serializer.rb', line 71 def write_tabulated_first_time(value) @written[value.object_id] = @written.size case value when Symbol, Regexp, Semantic::Version, Semantic::VersionRange, Time::Timestamp, Time::Timespan, Types::PSensitiveType::Sensitive, Types::PBinaryType::Binary @writer.write(value) when Array start_array(value.size) value.each { |elem| write(elem) } when Hash start_map(value.size) value.each_pair { |key, val| write(key); write(val) } when Types::PTypeReferenceType @writer.write(value) when Types::PuppetObject value._ptype.write(value, self) else impl_class = value.class type = Loaders.implementation_registry.type_for_module(impl_class) raise SerializationError, "No Puppet Type found for #{impl_class.name}" unless type.is_a?(Types::PObjectType) type.write(value, self) end end |