Well, I admit that I'm projecting onto Java what I know about languages that compile down to low-level, IL binaries, which I mostly understand through .Net/C#.
I think the biggest problem for this type of implementation is that when serializing an object, frameworks such as .Net (or in this case Java) need to assure that once an object is serialized (either to JSON, XML or even to a binary-state) their must be assurance that any restoration from the serialized value, to a java object MUST restore the full state of the object.
Consider the following example to illustrate the problem.
public MyClass : object
private a;
private b;
public c {get a+b;}
constructor MyClass (int a, int b)
{
}
...
MyClass x = new MyClass(1, 2);
string json = MyClass.toJSONString();
We would hope/suspect that json would equal something like "{c:3}". There is nothing wrong with this but we have one big problem! Now we need to take our json value and create a new MyClass object. How do we do that?
We can't because we need to know the state of 'a' and 'b', in order to deserialize the JSON object and create a Java, MyClass object.
When you inherit from a serializer class (MyClass : SerialiableObject) the base serializer will either not care about this error, or it will allow for you to decorate your properties an variables so that the object can be properly serialized. For instance, we could imagine something like this is being available.
public MyClass : Serializable
//Attribute (is such a thing available in Java??? honestly, I don't know)
[Serialize=true, Deserialize=true]
private a;
[Serialize=true, Deserialize=true]
private b;
[Serialize=false]
public c {get a+b;}
constructor MyClass (int a, int b)
{
}
...
MyClass x = new MyClass(1, 2);
string json = MyClass.toJSONString();
After executing such code, our serialized JSON should state "{a:1, b:2}". As such, if we calls something like:
MyClass deserializeIt = MyClass.FromJSON(jsonStr);
In so doing, the value of a and b will be restored and the parser will not expect a value for c. The java implementation of MyClass for the deserializeIt object, however, will provide the proper implementation for the c property.
This is why out-of-the-box serialization is a problem that hasn't been solved. If you frequently work with low-level languages, this doesn't make sense. But since maintaining the state of private variable is a BIG DEAL, it's not easy to serialize objects that can then be deserialized back into their original type.