X-Git-Url: http://nitlanguage.org diff --git a/lib/serialization.nit b/lib/serialization.nit index cd80d3d..8a1d1ee 100644 --- a/lib/serialization.nit +++ b/lib/serialization.nit @@ -15,7 +15,9 @@ # limitations under the License. # Offers services to serialize a Nit objects to different persistent formats -module serialization +module serialization is + new_annotation auto_serializable +end # Abstract serialization service to be sub-classed by specialized services. interface Serializer @@ -28,13 +30,20 @@ interface Serializer # Serialize an attribute, used by `Serializable::core_serialize_to` fun serialize_attribute(name: String, value: nullable Object) do + if not try_to_serialize(value) then + warn("argument {value.class_name}::{name} is not serializable.") + end + end + + # Serialize `value` is possie, i.e. it is `Serializable` or `null` + fun try_to_serialize(value: nullable Object): Bool + do if value isa Serializable then value.serialize_to_or_delay(self) else if value == null then serialize value - else - warn("argument {value.class_name}::{name} is not serializable.") - end + else return false + return true end # Warn of problems and potential errors (such as if an attribute @@ -42,6 +51,28 @@ interface Serializer fun warn(msg: String) do print "Serialization warning: {msg}" end +# Abstract deserialization service +# +# After initialization of one of its sub-classes, call `deserialize` +interface Deserializer + # Main method of this class, returns a Nit object + fun deserialize: nullable Object is abstract + + # Internal method to be implemented by sub-classes + fun deserialize_attribute(name: String): nullable Object is abstract + + # Internal method called by objects in creation, + # to be implemented by sub-classes + fun notify_of_creation(new_object: Object) is abstract + + # Mainly generated method to return the next instance of the givent + # class by name + fun deserialize_class(class_name: String): Object do + print "Error: doesn't know how to deserialize class \"{class_name}\"" + abort + end +end + # Instances of this class can be passed to `Serializer::serialize` interface Serializable # Full or true serialization @@ -69,3 +100,4 @@ redef class Int super DirectSerializable end redef class Float super DirectSerializable end redef class NativeString super DirectSerializable end redef class String super DirectSerializable end +redef class Array[E] super Serializable end