Since some time Eiffel supports a serialization method completely written in Eiffel. It directly supports serialization to a file or to memory. This example shows how to use this to serialize an arbitrary object structure to a string. The trick is to serialize to memory and look at the serialized byte buffer as a c string which then can be read into an Eiffel string. To deserialize we do the reverse.
serialize (a_object: ANY): STRING is
-- Serialize `a_object'.
require
a_object_not_void: a_object /= Void
local
l_sed_rw: SED_MEMORY_READER_WRITER
l_sed_ser: SED_INDEPENDENT_SERIALIZER
l_cstring: C_STRING
l_cnt: INTEGER
do
create l_sed_rw.make
l_sed_rw.set_for_writing
create l_sed_ser.make (l_sed_rw)
l_sed_ser.set_root_object (a_object)
l_sed_ser.encode
-- the `count' gives us the number of bytes
-- we have to read and put into the string.
l_cnt := l_sed_rw.count
create l_cstring.make_by_pointer_and_count (l_sed_rw.buffer.item, l_cnt)
Result := l_cstring.substring (1, l_cnt)
ensure
serialize_not_void: Result /= Void
end
deserialize (a_string: STRING): ANY is
-- Deserialize `a_string'.
require
a_string_not_void: a_string /= Void
local
l_sed_rw: SED_MEMORY_READER_WRITER
l_sed_ser: SED_INDEPENDENT_DESERIALIZER
l_cstring: C_STRING
do
create l_cstring.make (a_string)
create l_sed_rw.make_with_buffer (l_cstring.managed_data)
l_sed_rw.set_for_reading
create l_sed_ser.make (l_sed_rw)
l_sed_ser.decode (True)
Result := l_sed_ser.last_decoded_object
end
-- Serialize `a_object'.
require
a_object_not_void: a_object /= Void
local
l_sed_rw: SED_MEMORY_READER_WRITER
l_sed_ser: SED_INDEPENDENT_SERIALIZER
l_cstring: C_STRING
l_cnt: INTEGER
do
create l_sed_rw.make
l_sed_rw.set_for_writing
create l_sed_ser.make (l_sed_rw)
l_sed_ser.set_root_object (a_object)
l_sed_ser.encode
-- the `count' gives us the number of bytes
-- we have to read and put into the string.
l_cnt := l_sed_rw.count
create l_cstring.make_by_pointer_and_count (l_sed_rw.buffer.item, l_cnt)
Result := l_cstring.substring (1, l_cnt)
ensure
serialize_not_void: Result /= Void
end
deserialize (a_string: STRING): ANY is
-- Deserialize `a_string'.
require
a_string_not_void: a_string /= Void
local
l_sed_rw: SED_MEMORY_READER_WRITER
l_sed_ser: SED_INDEPENDENT_DESERIALIZER
l_cstring: C_STRING
do
create l_cstring.make (a_string)
create l_sed_rw.make_with_buffer (l_cstring.managed_data)
l_sed_rw.set_for_reading
create l_sed_ser.make (l_sed_rw)
l_sed_ser.decode (True)
Result := l_sed_ser.last_decoded_object
end


