Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Проблема сериалиации Java -> ActionScript 3 с BlazeDS (http://www.flasher.ru/forum/showthread.php?t=135281)

ligett 20.01.2010 00:34

Проблема сериалиации Java -> ActionScript 3 с BlazeDS
 
Огромная просьба помочь, 3ий (!) день бьюсь надо проблемой - в отчаянии. Уверен что что-то мелкое, но не могу понять где!!


- Есть два класса: Device и SpliceClosure, Device - предок, SpliceClosure - его потомок
- Одни и те же классы - в Java и в ActionScript
- Почему-то java класс Device сериализуется нормально в AS класс Device
- А класс SpliceClosure начисто отказывается, сериализуется вместо этого в Object и выдает type coercion error
- У меня есть другие унаследованные классы и всё работает нормально, проблема лишь с этим SpliceClosure


Вот код классов и ниже дебаг аутпут BlazeDS (сериализация выглядит идентично для обоих классов!! ошибок явно никаких):

---------------------------- JAVA: Device ---------------------------------------

Код:

public class Device  implements java.io.Serializable {

        private static final long serialVersionUID = 87770011L;

    protected Integer id;
    protected Location location;
    protected String code;
    protected String manufacturer;
    protected String manufacturerTypeCode;
    protected String serialNumber;
    protected Set<DeviceConnector> connectors = new HashSet<DeviceConnector>(0);
   
    public Device() {
    }

    public Device(
                            Location location,
                            String code,
                            String manufacturer,
                            String manufacturerTypeCode,
                            String serialNumber,
                            Set<DeviceConnector> connectors
                            ) {
            this.location = location;
            this.code = code;
            this.manufacturer = manufacturer;
        this.manufacturerTypeCode = manufacturerTypeCode;
        this.serialNumber = serialNumber;
        this.connectors = connectors;
    }
 
    public Integer getId() {
        return this.id;
    }
   
    public void setId(Integer id) {
        this.id = id;
    }
   
    public Location getLocation() {
        return this.location;
    }
   
    public void setLocation(Location location) {
        this.location = location;
    }
   
    public String getCode() {
        return this.code;
    }
   
    public void setCode(String code) {
        this.code = code;
    }

    public String getManufacturer() {
                return manufacturer;
        }

        public void setManufacturer(String manufacturer) {
                this.manufacturer = manufacturer;
        }

        public String getSerialNumber() {
                return serialNumber;
        }

        public void setSerialNumber(String serialNumber) {
                this.serialNumber = serialNumber;
        }

        public String getManufacturerTypeCode() {
                return manufacturerTypeCode;
        }

        public void setManufacturerTypeCode(String manufacturerTypeCode) {
                this.manufacturerTypeCode = manufacturerTypeCode;
        }

    public Set<DeviceConnector> getConnectors() {
                return connectors;
        }

        public void setConnectors(Set<DeviceConnector> connectors) {
                this.connectors = connectors;
        }

        public String toString(){
            StringBuilder r = new StringBuilder("Device[");
            r.append(" id=" + id);
            r.append(" code=" + code);
            r.append("]");
           
            r.append(super.toString());
           
            return r.toString();
    }
}

-------------------------- ActionScript 3: Device ------------------------------------
Код AS1/AS2:

package sit.si.CableTool.data
{
        import mx.collections.ArrayCollection;
        import net.digitalprimates.persistence.hibernate.HibernateBean;
 
    [RemoteClass(alias="sit.si.data.CableTool.Device")]
    [Managed]
        public class Device extends HibernateBean
        {
                public var id : Number;
                public var location : Location;
                public var code : String;
            public var manufacturer : String;
            public var manufacturerTypeCode : String;
            public var serialNumber : String;
 
                protected var connectors_: ArrayCollection = new ArrayCollection();
 
                public function get connectors() : ArrayCollection {
                        if( connectors_ == null ){
                                connectors_ = new ArrayCollection();
                        }
                        return connectors_;
                }
 
                public function set connectors(connectors_ : ArrayCollection) : void {                       
                        this.connectors_ = connectors_;
                }
 
 
                public function getCables() : ArrayCollection {
                        var cables : ArrayCollection = new ArrayCollection();
                        for each( var connector : DeviceConnector in connectors ){
//                                if( ! cables.contains( cableEndpoint.cable ) ){
//                                        cables.addItem( cableEndpoint.cable );
//                                }
                        }
                        return cables;
                }
 
                public function toString() : String {
                        var result : String = "Device[";
                        result += "Id: " + id;
                        result += "Code: " + code;
                        result += "Location: " + location;
                        result += "Manufacturer: " + manufacturer;
                        result += "Serial Number: " + serialNumber;
                        result += "]";
 
                        return result;
                }
        }
}

--------------- JAVA: SpliceClosure -------------------------------
Код:

public class SpliceClosure extends Device implements java.io.Serializable
        {

        private static final long serialVersionUID = 87770009L;

    public SpliceClosure() {
            super();
    }
}

---------------- ActionScript: Splice Closure ----------------------
Код AS3:

package sit.si.CableTool.data
{
        import mx.collections.ArrayCollection;
 
    [RemoteClass(alias="sit.si.data.CableTool.SpliceClosure")]
    [Managed]
        public class SpliceClosure extends Device
        {
                public override function toString() : String{
                        var result : String = "SpliceClosure[";
                        result += "Id: " + id;
//                        result += "Code: " + code;
//                        result += "Number of splicings: " + splicings.length;
                        result += "]";
 
                        return result;
                }
 
        }
}

--------------BLAZEDS DEBUG OUTPUT --------------------------------------------------------------

Код:

[BlazeDS]Adapter 'java-object' called 'sit.si.CableTool.DAO.Devices.getDevice(java.util.Arrays$ArrayList (Collection size:1)
  [0] = 5454
)'
[BlazeDS]Result: 'Device[ id=5454 code=SPL1123]sit.si.data.CableTool.SpliceClosure@8d5aad'
[BlazeDS]Serializing AMF/HTTP response
Version: 3
  (Message #0 targetURI=/2/onResult, responseURI=)
    (Externalizable Object #0 'DSK')
      (Typed Object #1 'sit.si.data.CableTool.SpliceClosure')
        id = 5454
        connectors = (Externalizable Object #2 'flex.messaging.io.ArrayCollection')
          (Array #3)
        location = null
        manufacturer = null
        serialNumber = "1624887"
        manufacturerTypeCode = "SP16-SERIES-A1"
        code = "SPL1123"
1.263924520428E12
(Byte Array #4, Length 16)
(Byte Array #5, Length 16)
(Byte Array #6, Length 16)

..........


[BlazeDS]Adapter 'java-object' called 'sit.si.CableTool.DAO.Devices.getDevice(java.util.Arrays$ArrayList (Collection size:1)
  [0] = 5555
)'
[BlazeDS]Result: 'Device[ id=5555 code=22222]sit.si.data.CableTool.Device@4ef630'
[BlazeDS]Serializing AMF/HTTP response
Version: 3
  (Message #0 targetURI=/3/onResult, responseURI=)
    (Externalizable Object #0 'DSK')
      (Typed Object #1 'sit.si.data.CableTool.Device')
        id = 5555
        connectors = (Externalizable Object #2 'flex.messaging.io.ArrayCollection')
          (Array #3)
        location = null
        manufacturer = null
        serialNumber = "111111"
        manufacturerTypeCode = "44"
        code = "22222"
1.263924520646E12
(Byte Array #4, Length 16)
(Byte Array #5, Length 16)
(Byte Array #6, Length 16)


Ixanezis 20.01.2010 18:53

Если я правильно понял - вам надо сериализовать объект на джаве и десериализовать его во флеше? о_о
В таком случае, странно, что один объект сериализовался нормально. Java сериализует по своим каким-то правилам. И только она нормально может десериализовать. А флеш - во своим. Тут нет стандарта.. Впрочем, я точно не знаю, говорю, что думаю.

ligett 20.01.2010 19:40

Не совсем, дело в том что есть стандартные механизмы де- и сериализации - Java <-> AS. В частности этим занимается BlazeDS.

Просто есть частная проблема с одним Java классом, который, гад, не хочет превращаться в правильный AS класс (неправильно десериализуется).

Вот вообщем и думал - может есть у кого догадки - куда смотреть.

Тем не менее, спасибо что пытаетесь помочь Ixanezis

Добавлено через 6 часов 17 минут
для следующих поколений - вот описание проблемы и решение: http://riapriority.com/blogs/graann....sterclassalias

А у меня сработало простое:

var s : SpliceClosure = new SpliceClosure();
в классе инициации..


Часовой пояс GMT +4, время: 03:34.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.