# 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
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 abort
+end
+
# Instances of this class can be passed to `Serializer::serialize`
interface Serializable
# Full or true serialization
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