public String getType() {
      return TypeEncoder.encode(getTypeMirror());
    }
We compute a {@code serialVersionUID} for the generated class based on the names and types of
the annotation members that the {@code @AutoAnnotation} method defines. These are exactly the
names and types of the instance fields in the generated class. So in the common case where the
annotation acquires a new member with a default value, if the {@code @AutoAnnotation} method is
not changed then the generated class will acquire an implementation of the new member method
which just returns the default value. The {@code serialVersionUID} will not change, which makes
sense because the instance fields haven't changed, and instances that were serialized before
the new member was added should deserialize fine. On the other hand, if you then add a
parameter to the {@code @AutoAnnotation} method for the new member, the implementation class
will acquire a new instance field, and we will compute a different {@code serialVersionUID}.
That's because an instance serialized before that change would not have a value for the new
instance field, which would end up zero or null. Users don't expect annotation methods to
return null so that would be bad.

<p>We could instead add a {@code readObject(ObjectInputStream)} method that would check that
all of the instance fields are really present in the deserialized instance, and perhaps replace
them with their default values from the annotation if not. That seems a lot more complicated
than is justified, though, especially since the instance fields are final and would have to be
set in the deserialized object through reflection.
value/src/main/java/com/google/auto/value/processor/AutoAnnotationProcessor.java