class Gossiperl::Client::Serialization::Serializer
Public Instance Methods
deserialize(bin_digest)
click to toggle source
# File lib/gossiperl_client/serialization/serializer.rb, line 45 def deserialize bin_digest envelope_resp = self.digest_from_binary('digestEnvelope', bin_digest) if envelope_resp.has_key?(:ok) embedded_type = self.digest_type_class( envelope_resp[:ok].payload_type ) if embedded_type == :forward return { :forward => true, :type => envelope_resp[:ok].payload_type, :envelope => envelope_resp[:ok] } else payload = digest_from_binary( envelope_resp[:ok].payload_type, Base64.strict_decode64( envelope_resp[:ok].bin_payload ) ) if payload.has_key?(:ok) return payload[:ok] else return { :error => :not_thrift } end end end return { :error => :not_thrift } end
digest_from_binary(digest_type, bin_digest)
click to toggle source
# File lib/gossiperl_client/serialization/serializer.rb, line 74 def digest_from_binary digest_type, bin_digest begin transport = ::Thrift::MemoryBufferTransport.new( bin_digest ) protocol = ::Thrift::BinaryProtocol.new(transport) digest = self.digest_type_class(digest_type).new digest.read( protocol ) return { :ok => digest } rescue Exception => ex return { :error => ex } end end
digest_to_binary(digest)
click to toggle source
# File lib/gossiperl_client/serialization/serializer.rb, line 67 def digest_to_binary digest transport = ::Thrift::MemoryBufferTransport.new() protocol = ::Thrift::BinaryProtocol.new(transport) digest.write( protocol ) protocol.trans.read( protocol.trans.available ).force_encoding('UTF-8') end
digest_type_class(digest_type)
click to toggle source
# File lib/gossiperl_client/serialization/serializer.rb, line 86 def digest_type_class digest_type types = { 'digestError' => Gossiperl::Client::Thrift::DigestError, 'digestForwardedAck' => Gossiperl::Client::Thrift::DigestForwardedAck, 'digestEnvelope' => Gossiperl::Client::Thrift::DigestEnvelope, 'digest' => Gossiperl::Client::Thrift::Digest, 'digestAck' => Gossiperl::Client::Thrift::DigestAck, 'digestSubscriptions' => Gossiperl::Client::Thrift::DigestSubscriptions, 'digestExit' => Gossiperl::Client::Thrift::DigestExit, 'digestSubscribe' => Gossiperl::Client::Thrift::DigestSubscribe, 'digestSubscribeAck' => Gossiperl::Client::Thrift::DigestSubscribeAck, 'digestUnsubscribe' => Gossiperl::Client::Thrift::DigestUnsubscribe, 'digestUnsubscribeAck' => Gossiperl::Client::Thrift::DigestUnsubscribeAck, 'digestEvent' => Gossiperl::Client::Thrift::DigestEvent } return types[ digest_type ] if types.has_key? digest_type return :forward end
serialize(digest)
click to toggle source
# File lib/gossiperl_client/serialization/serializer.rb, line 32 def serialize digest digest_type = digest.class.name.split('::').last digest_type = digest_type[0].downcase + digest_type[1..digest_type.length] if digest_type == 'digestEnvelope' return self.digest_to_binary( envelope ) end envelope = Gossiperl::Client::Thrift::DigestEnvelope.new envelope.payload_type = digest_type envelope.bin_payload = Base64.strict_encode64( self.digest_to_binary( digest ) ) envelope.id = SecureRandom.uuid.to_s self.digest_to_binary( envelope ) end
serialize_arbitrary(digest_type, digest_data)
click to toggle source
# File lib/gossiperl_client/serialization/serializer.rb, line 9 def serialize_arbitrary digest_type, digest_data transport = ::Thrift::MemoryBufferTransport.new() protocol = ::Thrift::BinaryProtocol.new(transport) protocol.write_struct_begin(digest_type.to_s) digest_data.each_key{|key| value = digest_data[key][:value] type = self.type_to_thrift_type( digest_data[key][:type] ) unless type.nil? protocol.write_field({ :type => type, :name => key.to_s }, digest_data[key][:field_id], value ) else raise ArgumentError.new("Unsupported serializable type #{digest_data[key][:type]} for field #{key.to_s}.") end } protocol.write_field_stop protocol.write_struct_end envelope = Gossiperl::Client::Thrift::DigestEnvelope.new envelope.payload_type = digest_type.to_s envelope.bin_payload = Base64.strict_encode64( protocol.trans.read( protocol.trans.available ).force_encoding('UTF-8') ) envelope.id = SecureRandom.uuid.to_s self.digest_to_binary( envelope ) end
type_to_thrift_type(type)
click to toggle source
# File lib/gossiperl_client/serialization/serializer.rb, line 105 def type_to_thrift_type type type = type.to_sym serializable_thrift_types = { :bool => ::Thrift::Types::BOOL, :byte => ::Thrift::Types::BYTE, :double => ::Thrift::Types::DOUBLE, :i16 => ::Thrift::Types::I16, :i32 => ::Thrift::Types::I32, :i64 => ::Thrift::Types::I64, :string => ::Thrift::Types::STRING } return (serializable_thrift_types)[ type ] if serializable_thrift_types.has_key? type return nil end