google-code-export / rocket-gwt

Automatically exported from code.google.com/p/rocket-gwt
1 stars 1 forks source link

Rocket serialization compiler errors out if class to be serialized contains a non-transient enum type field. #61

Open GoogleCodeExporter opened 9 years ago

GoogleCodeExporter commented 9 years ago
Rocket serialization compiler errors out if class to be serialized 
contains a non-transient enum type field.  This happens because java's 
Enum class contains non-transient final fields in it, like "ordinal" 
and "name".  Unlike the standard GWT compiler which treats these as 
warnings, the rocket compiler treats these as errors and fails to 
compile.  Due to this error, I am unable to find a way to use enumeration 
type fields in the classes that I wish to serialize with the rocket 
serialization library.

What steps will reproduce the problem?
1. Create a class like the following:
public class TestEnumInRocket implements Serializable {
    private static final long serialVersionUID = 1L;

    public enum EnumTest implements Serializable {
        one,
        two
    }

    private EnumTest enumerationField;

    public TestEnumInRocket() {
    }

    public EnumTest getEnumerationField() {
        return enumerationField;
    }

    public void setEnumerationField(EnumTest enumerationField) {
        this.enumerationField = enumerationField;
    }
}

2. Add the following entries in your rocket serialization factory:
@serialization-readableTypes 
com.gwtblocks.client.serialization.rocket.TestEnumInRocket
@serialization-writableTypes 
com.gwtblocks.client.serialization.rocket.TestEnumInRocket

3. Try to run the gwt compile process and it will error out.  The error is 
listed below.

What is the expected output? What do you see instead?
I expect that this should be allowed, otherwise how do you get enumeration 
fields to serialize.  The error I get is listed below:

   Computing all possible rebind results 
for 'com.gwtblocks.client.serialization.rocket.RocketSerializationFactory'
      Rebinding 
com.gwtblocks.client.serialization.rocket.RocketSerializationFactory
         Invoking <generate-with 
class='rocket.serialization.rebind.SerializationFactoryGenerator'/>
            Recieved 
type "com.gwtblocks.client.serialization.rocket.RocketSerializationFactory"
.
            Attempting to load and merge all blacklists (unsorted).
            Finding existing ObjectReaders...
            Finding existing ObjectWriters...
            Finding all serializable types reachable from class 
com.gwtblocks.client.serialization.rocket.TestEnumInRocket
               com.gwtblocks.client.serialization.rocket.TestEnumInRocket
                  Field: enumerationField

com.gwtblocks.client.serialization.rocket.TestEnumInRocket.EnumTest
                        java.lang.Enum
                           Field: name
                              [ERROR] Problem whilst running generator for 
type "com.gwtblocks.client.serialization.rocket.RocketSerializationFactory"
.
rocket.serialization.rebind.SerializationFactoryGeneratorException: Fields 
that are final cannot be deserialized, Field: private final 
java.lang.String name, enclosingType: class java.lang.Enum<E>
    at 
rocket.serialization.rebind.SerializationFactoryGenerator.throwFinalFieldEn
countered(SerializationFactoryGenerator.java:773)
    at 
rocket.serialization.rebind.SerializationFactoryGenerator$4.visitField
(SerializationFactoryGenerator.java:601)
    at 
rocket.generator.rebind.visitor.ReachableTypesVisitor.visitFields
(ReachableTypesVisitor.java:221)
    at 
rocket.serialization.rebind.SerializationFactoryGenerator$4.visitFields
(SerializationFactoryGenerator.java:570)
    at 
rocket.generator.rebind.visitor.ReachableTypesVisitor.visitSuperType
(ReachableTypesVisitor.java:166)
    at 
rocket.serialization.rebind.SerializationFactoryGenerator$4.visitSuperType
(SerializationFactoryGenerator.java:550)
    at 
rocket.generator.rebind.visitor.ReachableTypesVisitor.processSuperType
(ReachableTypesVisitor.java:158)
    at rocket.generator.rebind.visitor.ReachableTypesVisitor$1.visit
(ReachableTypesVisitor.java:141)
    at rocket.generator.rebind.visitor.SuperTypesVisitor.start
(SuperTypesVisitor.java:44)
    at 
rocket.generator.rebind.visitor.ReachableTypesVisitor.visitSuperTypes0
(ReachableTypesVisitor.java:150)
    at 
rocket.generator.rebind.visitor.ReachableTypesVisitor.visitSuperTypes
(ReachableTypesVisitor.java:130)
    at 
rocket.generator.rebind.visitor.ReachableTypesVisitor.processType
(ReachableTypesVisitor.java:121)
    at rocket.generator.rebind.visitor.ReachableTypesVisitor.visitType
(ReachableTypesVisitor.java:83)
    at 
rocket.serialization.rebind.SerializationFactoryGenerator$4.visitType
(SerializationFactoryGenerator.java:537)
    at 
rocket.serialization.rebind.SerializationFactoryGenerator$4.visitField
(SerializationFactoryGenerator.java:633)
    at 
rocket.generator.rebind.visitor.ReachableTypesVisitor.visitFields
(ReachableTypesVisitor.java:221)
    at 
rocket.serialization.rebind.SerializationFactoryGenerator$4.visitFields
(SerializationFactoryGenerator.java:570)
    at 
rocket.generator.rebind.visitor.ReachableTypesVisitor.processType
(ReachableTypesVisitor.java:122)
    at rocket.generator.rebind.visitor.ReachableTypesVisitor.visitType
(ReachableTypesVisitor.java:83)
    at 
rocket.serialization.rebind.SerializationFactoryGenerator$4.visitType
(SerializationFactoryGenerator.java:537)
    at rocket.generator.rebind.visitor.ReachableTypesVisitor.start
(ReachableTypesVisitor.java:43)
    at 
rocket.serialization.rebind.SerializationFactoryGenerator.findSerializableT
ypes(SerializationFactoryGenerator.java:640)
    at 
rocket.serialization.rebind.SerializationFactoryGenerator.findSerializableT
ypes(SerializationFactoryGenerator.java:466)
    at 
rocket.serialization.rebind.SerializationFactoryGenerator.assembleNewType
(SerializationFactoryGenerator.java:101)
    at rocket.generator.rebind.Generator.assembleNewType
(Generator.java:131)
    at rocket.generator.rebind.Generator.createNewTypeIfNecessary
(Generator.java:86)
    at rocket.generator.rebind.Generator.generate(Generator.java:60)
    at rocket.generator.rebind.Generator.generate(Generator.java:44)
    at com.google.gwt.dev.cfg.RuleGenerateWith.realize
(RuleGenerateWith.java:51)
    at com.google.gwt.dev.shell.StandardRebindOracle$Rebinder.tryRebind
(StandardRebindOracle.java:116)
    at com.google.gwt.dev.shell.StandardRebindOracle$Rebinder.rebind
(StandardRebindOracle.java:61)
    at com.google.gwt.dev.shell.StandardRebindOracle.rebind
(StandardRebindOracle.java:166)
    at 
com.google.gwt.dev.GWTCompiler$DistillerRebindPermutationOracle.getAllPossi
bleRebindAnswers(GWTCompiler.java:193)
    at 
com.google.gwt.dev.jdt.WebModeCompilerFrontEnd.doFindAdditionalTypesUsingRe
binds(WebModeCompilerFrontEnd.java:128)
    at com.google.gwt.dev.jdt.AbstractCompiler$CompilerImpl.process
(AbstractCompiler.java:150)
    at org.eclipse.jdt.internal.compiler.Compiler.compile
(Compiler.java:392)
    at com.google.gwt.dev.jdt.AbstractCompiler$CompilerImpl.compile
(AbstractCompiler.java:84)
    at com.google.gwt.dev.jdt.AbstractCompiler$CompilerImpl.compile
(AbstractCompiler.java:180)
    at com.google.gwt.dev.jdt.AbstractCompiler$CompilerImpl.access$400
(AbstractCompiler.java:70)
    at com.google.gwt.dev.jdt.AbstractCompiler.compile
(AbstractCompiler.java:493)
    at 
com.google.gwt.dev.jdt.WebModeCompilerFrontEnd.getCompilationUnitDeclaratio
ns(WebModeCompilerFrontEnd.java:73)
    at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.<init>
(JavaToJavaScriptCompiler.java:284)
    at com.google.gwt.dev.GWTCompiler.distill(GWTCompiler.java:348)
    at com.google.gwt.dev.GWTCompiler.run(GWTCompiler.java:558)
    at com.google.gwt.dev.GWTCompiler.run(GWTCompiler.java:549)
    at com.google.gwt.dev.GWTCompiler.main(GWTCompiler.java:211)

What version of the product are you using? On what operating system?
rocket 0.56 on windows XP

Please provide any additional information below.

Original issue reported on code.google.com by fvil...@gmail.com on 23 Feb 2009 at 8:07

GoogleCodeExporter commented 9 years ago
I forgot to mention that if I mark the enumeration fields that are in my class 
transient, then it will compile.  However, if I do that, then I will lose their 
values when I try to deserialize the class.

Original comment by fvil...@gmail.com on 23 Feb 2009 at 8:19