Issue Details (XML | Word | Printable)

Key: GDS-85
Type: Bug Bug
Status: Closed Closed
Resolution: Won't Fix
Priority: Critical Critical
Assignee: Franck Wolff
Reporter: Carsten Wolters
Votes: 1
Watchers: 2
Operations

If you were logged in you would be able to see more operations.
GraniteDS

Invalid AM3 serialization of eager-loaded enum Set/List (CollectionOfElements)

Created: 03/Feb/08 02:36 PM   Updated: 27/May/08 04:54 PM   Resolved: 27/May/08 04:54 PM
Component/s: AMF3 (de)serialization
Affects Version/s: 1.0.0_RC2
Fix Version/s: None


 Description  « Hide
My entity bean has a field like:

@CollectionOfElements(fetch = FetchType.EAGER)
@Enumerated(EnumType.STRING)
@JoinTable(name = "user_event_types", joinColumns = @JoinColumn(name = "user_id"))
private Set<EventMessageEventType> eventTypes;


where EventMessageEventType is an enum:

public enum EventMessageEventType {
ChannelMessage, BlogEntry, CleanupEvictorQueue
}

I get an error by deserializing the am3-message:

"ArgumentError: Error #2004: Einer der Parameter ist ungültig.
at flash.utils::ObjectInput/readObject()
at com.maxtrading.user.entities::UserBase/readExternal()[E:\Projekte\pvs\bardtke\web\st\generated\main\mxml\com\maxtrading\user\entities\UserBase.as:155]
"

        override public function readExternal(input:IDataInput):void {
            super.readExternal(input);
            if (meta::isInitialized()) {
                _activationKey = input.readObject() as String;
                _email = input.readObject() as String;
                _enabled = input.readObject() as Boolean;
line 155 ->> _eventTypes = input.readObject() as ArrayCollection;
                _invoiceAccount = input.readObject() as Account;



The loaded entity-field is an empty set.

I debuuged it down to swriteAMF3Array:

    protected void writeAMF3Array(Object array) throws IOException {
        if (debugMore) logMore.debug("writeAMF3Array(array=%s)", array);

        write(AMF3_ARRAY);

        int index = indexOfStoredObjects(array);
        if (index >= 0)
            writeAMF3IntegerData(index << 1);
        else {
            addToStoredObjects(array);

            int length = Array.getLength(array);
            writeAMF3IntegerData(length << 1 | 0x01);
            write(0x01);
            for (int i = 0; i < length; i++)
                writeObject(Array.get(array, i));
        }
    }


In that case, index = -1 and the length property is set to 0. The expression "writeAMF3IntegerData(length << 1 | 0x01);" will write "1" into the stream, but then, no object is written, cause length is 0. May this be the bug?




Here is the log of the AM3Serializer:

14:29:31,969 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeObject(o=org.granite.hibernate.HibernatePersistentSet@358379)
14:29:39,953 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] writeAMF3Object(o=org.granite.hibernate.HibernatePersistentSet@358379)...
14:29:43,000 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] indexOfStoredObjects(o=org.granite.hibernate.HibernatePersistentSet@358379) -> -1
14:29:44,719 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] addToStoredObjects(o=org.granite.hibernate.HibernatePersistentSet@358379) at index=4
14:29:49,094 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] writeAMF3Object() - classGetter=org.granite.hibernate.HibernateClassGetter@4a8d8c
14:29:51,344 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] writeAMF3Object() - oClass=class org.granite.hibernate.HibernatePersistentSet
14:29:52,312 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] getFromStoredClassDescriptors(clazz=class org.granite.hibernate.HibernatePersistentSet)
14:29:52,312 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] getFromStoredClassDescriptors() -> null
14:29:54,234 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] addToStoredClassDescriptors(clazz=class org.granite.hibernate.HibernatePersistentSet)
14:29:54,234 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] addToStoredClassDescriptors() - putting: name="org.granite.hibernate.HibernatePersistentSet", iDesc=org.granite.messaging.amf.io.util.IndexedJavaClassDescriptor@3485a4
14:29:57,500 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeAMF3IntegerData(i=7)
14:29:59,094 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeAMF3StringData(s="org.granite.hibernate.HibernatePersistentSet")
14:29:59,094 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] indexOfStoredStrings(s="org.granite.hibernate.HibernatePersistentSet") -> -1
14:29:59,094 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] addToStoredStrings(s="org.granite.hibernate.HibernatePersistentSet") at index=13
14:29:59,094 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeAMF3IntegerData(i=89)
14:30:19,984 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] writeAMF3Object() - desc=org.granite.messaging.amf.io.util.DefaultJavaClassDescriptor@3485a0
14:30:33,625 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] writeAMF3Object() - legacy Externalizable=org.granite.hibernate.HibernatePersistentSet@358379
14:30:50,766 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeObject(o=true)
14:31:18,500 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeObject(o=[])
14:32:04,625 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeAMF3Array(array=[])
14:32:13,703 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] indexOfStoredObjects(o=[]) -> -1
14:32:25,609 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] addToStoredObjects(o=[]) at index=5
14:32:32,859 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeAMF3IntegerData(i=1)
14:36:43,172 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] writeAMF3Object(o=org.granite.hibernate.HibernatePersistentSet@358379) - Done





Carsten Wolters added a comment - 03/Feb/08 02:43 PM
I tried with a filled set of enums, but I get the same problem with the deserialization. Is looks as if this is a problem with enums.

Carsten Wolters added a comment - 16/Mar/08 04:10 PM
Frankk,

are you still working on this issue? I still cannot use granite, because of the faulty de/serialization. Please have a look at it.
If you need help to locate or setup the problem, just give me a note.

Cheers
Carsten

Carsten Wolters added a comment - 04/May/08 03:34 PM
Hi Franck.

I still cannot use your nice work, because of the wrong de-/serialization of such an entity-field:

@CollectionOfElements(fetch = FetchType.EAGER)
@Enumerated(EnumType.STRING)
@JoinTable(name = "user_event_types", joinColumns = @JoinColumn(name = "user_id"))
private Set<EventMessageEventTypeEnum> eventTypes = new HashSet<EventMessageEventTypeEnum>();


The serializer looks not that bad, but I do not have a deep knowledge of the requested am3-stream.

The corresponding debug output for an empty set is:

---------------
2008-05-04 14:26:40,093 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeObject(o=org.granite.hibernate.HibernatePersistentSet@4c2bac)
2008-05-04 14:26:40,093 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] writeAMF3Object(o=org.granite.hibernate.HibernatePersistentSet@4c2bac)...
2008-05-04 14:26:40,093 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] indexOfStoredObjects(o=org.granite.hibernate.HibernatePersistentSet@4c2bac) -> -1
2008-05-04 14:26:40,093 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] addToStoredObjects(o=org.granite.hibernate.HibernatePersistentSet@4c2bac) at index=4
2008-05-04 14:26:40,093 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] writeAMF3Object() - classGetter=org.granite.hibernate.HibernateClassGetter@8993c1
2008-05-04 14:26:40,093 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] writeAMF3Object() - oClass=class org.granite.hibernate.HibernatePersistentSet
2008-05-04 14:26:40,093 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] getFromStoredClassDescriptors(clazz=class org.granite.hibernate.HibernatePersistentSet)
2008-05-04 14:26:40,093 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] getFromStoredClassDescriptors() -> null
2008-05-04 14:26:40,093 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] addToStoredClassDescriptors(clazz=class org.granite.hibernate.HibernatePersistentSet)
2008-05-04 14:26:40,093 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] addToStoredClassDescriptors() - putting: name="org.granite.hibernate.HibernatePersistentSet", iDesc=org.granite.messaging.amf.io.util.IndexedJavaClassDescriptor@4a422e
2008-05-04 14:26:40,093 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeAMF3IntegerData(i=7)
2008-05-04 14:26:40,093 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeAMF3StringData(s="org.granite.hibernate.HibernatePersistentSet")
2008-05-04 14:26:40,103 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] indexOfStoredStrings(s="org.granite.hibernate.HibernatePersistentSet") -> -1
2008-05-04 14:26:40,103 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] addToStoredStrings(s="org.granite.hibernate.HibernatePersistentSet") at index=13
2008-05-04 14:26:40,103 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeAMF3IntegerData(i=89)
2008-05-04 14:26:40,103 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] writeAMF3Object() - desc=org.granite.messaging.amf.io.util.DefaultJavaClassDescriptor@4a3a7c
2008-05-04 14:26:40,103 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] writeAMF3Object() - legacy Externalizable=org.granite.hibernate.HibernatePersistentSet@4c2bac
2008-05-04 14:26:40,103 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeObject(o=true)
2008-05-04 14:26:40,103 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeObject(o=false)
2008-05-04 14:26:40,103 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeObject(o=[])
2008-05-04 14:26:40,103 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeAMF3Array(array=[])
2008-05-04 14:26:40,103 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] indexOfStoredObjects(o=[]) -> -1
2008-05-04 14:26:40,103 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] addToStoredObjects(o=[]) at index=5
2008-05-04 14:26:40,103 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeAMF3IntegerData(i=1)
2008-05-04 14:26:40,103 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] writeAMF3Object(o=org.granite.hibernate.HibernatePersistentSet@4c2bac) - Done
----------

and for a filled set I get:

---------------
2008-05-04 15:08:59,204 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeObject(o=org.granite.hibernate.HibernatePersistentSet@4cc9cf)
2008-05-04 15:09:32,542 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] writeAMF3Object(o=org.granite.hibernate.HibernatePersistentSet@4cc9cf)...
2008-05-04 15:10:21,362 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] indexOfStoredObjects(o=org.granite.hibernate.HibernatePersistentSet@4cc9cf) -> -1
2008-05-04 15:10:33,450 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] addToStoredObjects(o=org.granite.hibernate.HibernatePersistentSet@4cc9cf) at index=4
2008-05-04 15:11:01,720 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] writeAMF3Object() - classGetter=org.granite.hibernate.HibernateClassGetter@8993c1
2008-05-04 15:11:05,947 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] writeAMF3Object() - oClass=class org.granite.hibernate.HibernatePersistentSet
2008-05-04 15:11:18,264 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] getFromStoredClassDescriptors(clazz=class org.granite.hibernate.HibernatePersistentSet)
2008-05-04 15:11:33,807 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] getFromStoredClassDescriptors() -> null
2008-05-04 15:11:48,378 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] addToStoredClassDescriptors(clazz=class org.granite.hibernate.HibernatePersistentSet)
2008-05-04 15:11:56,229 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] addToStoredClassDescriptors() - putting: name="org.granite.hibernate.HibernatePersistentSet", iDesc=org.granite.messaging.amf.io.util.IndexedJavaClassDescriptor@466fea
2008-05-04 15:12:36,156 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeAMF3IntegerData(i=7)
2008-05-04 15:12:46,091 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeAMF3StringData(s="org.granite.hibernate.HibernatePersistentSet")
2008-05-04 15:12:46,091 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] indexOfStoredStrings(s="org.granite.hibernate.HibernatePersistentSet") -> -1
2008-05-04 15:12:46,091 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] addToStoredStrings(s="org.granite.hibernate.HibernatePersistentSet") at index=13
2008-05-04 15:12:46,091 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeAMF3IntegerData(i=89)
2008-05-04 15:13:10,385 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] writeAMF3Object() - desc=org.granite.messaging.amf.io.util.DefaultJavaClassDescriptor@466fe6
2008-05-04 15:13:25,557 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] writeAMF3Object() - legacy Externalizable=org.granite.hibernate.HibernatePersistentSet@4cc9cf
2008-05-04 15:13:43,583 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeObject(o=true)
2008-05-04 15:13:49,772 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeObject(o=false)
2008-05-04 15:14:03,622 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeObject(o=[ChannelMessage])
2008-05-04 15:14:35,698 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeAMF3Array(array=[ChannelMessage])
2008-05-04 15:14:47,585 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] indexOfStoredObjects(o=[ChannelMessage]) -> -1
2008-05-04 15:14:53,594 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] addToStoredObjects(o=[ChannelMessage]) at index=5
2008-05-04 15:15:05,651 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeAMF3IntegerData(i=3)
2008-05-04 15:15:17,058 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeObject(o=ChannelMessage)
2008-05-04 15:15:28,875 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] writeAMF3Object(o=ChannelMessage)...
2008-05-04 15:15:31,088 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] indexOfStoredObjects(o=ChannelMessage) -> -1
2008-05-04 15:15:32,830 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] addToStoredObjects(o=ChannelMessage) at index=6
2008-05-04 15:15:41,733 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] writeAMF3Object() - classGetter=org.granite.hibernate.HibernateClassGetter@8993c1
2008-05-04 15:15:44,998 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] writeAMF3Object() - oClass=class com.maxtrading.messaging.events.EventMessageEventTypeEnum
2008-05-04 15:15:48,002 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] getFromStoredClassDescriptors(clazz=class com.maxtrading.messaging.events.EventMessageEventTypeEnum)
2008-05-04 15:15:48,002 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] getFromStoredClassDescriptors() -> null
2008-05-04 15:15:51,057 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] addToStoredClassDescriptors(clazz=class com.maxtrading.messaging.events.EventMessageEventTypeEnum)
2008-05-04 15:15:51,057 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] addToStoredClassDescriptors() - putting: name="com.maxtrading.messaging.events.EventMessageEventTypeEnum", iDesc=org.granite.messaging.amf.io.util.IndexedJavaClassDescriptor@463932
2008-05-04 15:15:56,454 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeAMF3IntegerData(i=3)
2008-05-04 15:15:59,519 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeAMF3StringData(s="com.maxtrading.messaging.events.EventMessageEventTypeEnum")
2008-05-04 15:15:59,519 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] indexOfStoredStrings(s="com.maxtrading.messaging.events.EventMessageEventTypeEnum") -> -1
2008-05-04 15:15:59,519 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] addToStoredStrings(s="com.maxtrading.messaging.events.EventMessageEventTypeEnum") at index=14
2008-05-04 15:15:59,519 DEBUG [org.granite.messaging.amf.io.AMF3Serializer_MORE] writeAMF3IntegerData(i=115)
2008-05-04 15:16:01,351 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] writeAMF3Object() - desc=org.granite.messaging.amf.io.util.DefaultJavaClassDescriptor@463705
2008-05-04 15:16:03,304 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] writeAMF3Object() - writing defined properties...
2008-05-04 15:16:06,679 DEBUG [org.granite.messaging.amf.io.AMF3Serializer] writeAMF3Object(o=ChannelMessage) - Done
---------------



The GAS-generator created this readExternal(..) function for the entity:

        override public function readExternal(input:IDataInput):void {
            super.readExternal(input);
            if (meta::isInitialized()) {
                _activationKey = input.readObject() as String;
                _email = input.readObject() as String;
                _enabled = input.readObject() as Boolean;


line155-> _eventTypes = input.readObject() as ListCollectionView;


                _invoiceAccount = input.readObject() as Account;
                _invoices = input.readObject() as ListCollectionView;
                _loginKey = input.readObject() as String;
                _password = input.readObject() as String;
                _reasonNotEnabled = input.readObject() as String;
                _referrer = input.readObject() as User;
                _referreredUsers = input.readObject() as ListCollectionView;
                _sessionUUID = input.readObject() as String;
                _subscriptions = input.readObject() as ListCollectionView;
                _systemUser = input.readObject() as Boolean;
                _userDetails = input.readObject() as UserDetail;
                _userManagementDetails = input.readObject() as ListCollectionView;
                _userRoles = input.readObject() as ListCollectionView;
                _username = input.readObject() as String;
            }
        }


Everything works fine, until I reach

                _eventTypes = input.readObject() as ListCollectionView;

Here an exception is thrown:

ArgumentError: Error #2004: One of the parameter ist invalid.
at ObjectInput/readObject()
at com.maxtrading.user.entities::UserBase/readExternal()[E:\Projekte\workspace\portal\web\st\generated\main\mxml\com\maxtrading\user\entities\UserBase.as:155]



Can you please have a look at the problem or give me a hint what I can try at my side - I really would like to use your software package in my project.

Thanks

Carsten Wolters added a comment - 25/May/08 05:08 PM
Frankk,

finally I got it to work. There were several issues to resolve the problem:

- the granite-config.xml format has been changed, I tried took the latest one.
- the compiler-options where wrong (e.g. in eclipse - I had to add the
      -include-libraries lib/granite.swc
      -include-libraries lib/granite-hibernate.swc
to the compiler path.

You can close this bug!

Franck Wolff added a comment - 27/May/08 04:54 PM
Not a bug...