Where should object serialization logic (the mapping of fields into XML or JSON names and values) be placed? Inside each entity object OR into a different set of classes only concerned with serialization? Any other best practices out there that relate to this question?
For example:
class Person {
String name;
}
Some people go about it this way:
class Person {
String name;
public String toJson () {
// build JSON, use 'name' field
}
}
But if we also needed toXML(), toCSV(), toXYZ() keeping that direction would create horribly polluted code and break the Single Responsibility Principle which is already broken even with a single toJson method, IMHO.
Another option and this is what I typically do:
interface Serializer { public String toJson (); }
class PersonJsonSerializer implements Serializer {
private Person p;
public PersonJsonSerializer (Person p) { this.person = p; }
public String toJson () {
// build JSON, use p.name
}
}
then a factory hands out Serializers depending on entity types:
class JsonSerializerFactory {
public Serializer getSerializer (Object o) {
if (o instanceof Person) {
return new PersonJsonSerializer ((Person)o);
}
else if (o instanceof Account) {
return new AccountJsonSerializer ((Account)o);
}
// ... etc
}
}
There would also be XMLSerializerFactory, CSVSerializerFactory, and so forth.
However, most of the times people want to have full control over the serialization and would not buy into it and prefer to have toJson methods inside each class. They would claim is way simpler and less error prone.
What is the preferred way to go, and are there better alternatives to implement a solution to this problem?
Each superclass that is not serializable must have a public default constructor - a constructor with no parameters. Your class must implement the Serializable interface. Your class must serialize and deserialize the not-serializable fields in the superclasses. Transient data type is not serializable.
It's a little bit philosophical but by convention the default type of a class is not serializable, unless you explicitely define "this class can be serialized".
Implement the Serializable interface when you want to be able to convert an instance of a class into a series of bytes or when you think that a Serializable object might reference an instance of your class. Serializable classes are useful when you want to persist instances of them or send them over a wire.
Serialization in Java is the concept of representing an object's state as a byte stream. The byte stream has all the information about the object. Usually used in Hibernate, JMS, JPA, and EJB, serialization in Java helps transport the code from one JVM to another and then de-serialize it there.
I would say the serialization logic should not be part of the POCO/data classes for many reasons:
There will be other reasons as well but there are some strong arguments why you should not put the serialization logic into your POCO/Data Model.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With