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
How to store?
Hello, Thanks for your serialization solution but i've got a problem with it. I am going to store this string into my database (Mysql) and got rejected due to special characters. Do you know any ways to deal with it?
You may want to encode the string by using only ASCII characters.