
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
Comments
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
You may want to encode the string by using only ASCII characters.