com.google.gwt.user.client.rpc.SerializationException - PullRequest
0 голосов
/ 22 марта 2011

Я новичок в GAE, GWT, Hibernate и JDO.У меня есть Bus, BusStop и Route классы, которые сериализуются следующим образом:

BaseObject.java

package org.symphony.suchitra.gae.client.admin.model;
import java.io.Serializable;
public interface BaseObject extends Serializable {
    String getId();
}

Bus.java

@PersistenceCapable(identityType=IdentityType.APPLICATION)
public class Bus implements BaseObject {
    @PrimaryKey
    @Persistent(valueStrategy =IdGeneratorStrategy.IDENTITY)
    protected Long id;

    public String getId() {
        if( id == null ) {
            return null;
        }

        return id.toString();
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Persistent
    protected String busNumber;
    @Persistent
    @Unique
    protected String busIdentifier;
    @Persistent
    protected String routeId;

    public String getBusNumber() {
        return busNumber;
    }

    public void setBusNumber(String busNumber) {
        this.busNumber = busNumber;
    }

    public String getBusIdentifier() {
        return busIdentifier;
    }

    public void setBusIdentifier(String busIdentifier) {
        this.busIdentifier = busIdentifier;
    }

    public String getRouteId() {
        return routeId;
    }

    public void setRouteId(String routeId) {
        this.routeId = routeId;
    }
}

BusStop.java

@PersistenceCapable(identityType=IdentityType.APPLICATION)

public class BusStop implements BaseObject{
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    protected Long ident;

    public String getId() {
        if( ident == null ) {
            return null;
        }

        return ident.toString();
    }

    public void setId(String id) {
        this.ident = Long.parseLong(id);
    }

    @Persistent
    @Unique
    private String name;
    @Persistent
    private String latitude;
    @Persistent
    private String longitude;

    public String getLatitude() {
        return latitude;
    }

    public void setLatitude(String email) {
        this.latitude = email;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLongitude() {
        return longitude;
    }

    public void setLongitude(String password) {
        this.longitude = password;
    }
}

Route.java

@PersistenceCapable (identityType=IdentityType.APPLICATION)
public class Route implements BaseObject{
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    protected Long id;

    public String getId() {
        if( id == null ) {
            return null;
        }

        return id.toString();
    }

    public void setId(String id) {
        this.id = Long.parseLong(id);
    }

    @Persistent
    private String name;
    @Persistent
    private String sourceId;
    @Persistent
    private String destinationId;

    public String getSourceId() {
        return sourceId;
    }

    public void setSourceId(String source) {
        this.sourceId = source;
    }

    public String getDestinationId() {
        return destinationId;
    }

    public void setDestinationId(String destinationId) {
        this.destinationId = destinationId;
    }

    @Persistent
    private String totalDistance;
    @Persistent
    private String totalTime;
    @Persistent
    private List<Long> busStopKeys;

    @NotPersistent
    private List<BusStop> busStops;

    public String getTotalTime() {
        return totalTime;
    }

    public void setTotalTime(String totalTime) {
        this.totalTime = totalTime;
    }

    public List<BusStop> getBusStops() {
        return busStops;
    }

    public void setBusStops(List<BusStop> busStops) {
        this.busStops = busStops;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getTotalDistance() {
        return totalDistance;
    }

    public void setTotalDistance(String totalDistance) {
        this.totalDistance = totalDistance;
    }

    public List<Long> getBusStopKeys() {
        return busStopKeys;
    }

    public void setBusStopKeys(List<Long> busStopKeys) {
        this.busStopKeys = busStopKeys;
    }   
}

Отображения гибернации:

bus.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping  PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"       "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

 <hibernate-mapping>
<class name="org.symphony.suchitra.gae.client.admin.model.Bus" table="bus">
    <id column="bus_id" name="bus_id" type="java.lang.String"> 
        <generator class="org.hibernate.id.UUIDHexGenerator"> 
        </generator> 
    </id> 
    <property name="bus_number"/> 
    <property name="bus_identifier" unique="true"/>
    <property name="route_id"/>
</class>
 </hibernate-mapping>

busstop.hbm.xml

 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE hibernate-mapping  PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
<class name="org.symphony.suchitra.gae.client.admin.model.BusStop" table="busstop">
    <id column="busstop_id" name="busstop_id" type="java.lang.String"> 
        <generator class="org.hibernate.id.UUIDHexGenerator"> 
        </generator> 
    </id> 
    <property name="name"/> 
    <property name="latitude"/> 
    <property name="longitude"/> 
</class>
 </hibernate-mapping>

route.hbm.xml

  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE hibernate-mapping  PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

  <hibernate-mapping>
<class name="org.symphony.suchitra.gae.client.admin.model.Route">
    <id column="route_id" name="route_id" type="java.lang.String"> 
        <generator class="org.hibernate.id.UUIDHexGenerator"> 
        </generator> 
    </id> 
    <property name="name"/> 
    <property name="source"/>
    <property name="destination"/>
    <property name="total_distance"/> 
    <property name="total_time"/>
    <list name="busstoplist" table="busstoplist" cascade="save-update"> 
        <key column="route_id"/> 
        <list-index column="busstoplist_id"/> 
        <many-to-many class="org.symphony.suchitra.gae.client.admin.model.BusStop"   column="busstop_id"/>
    </list> 
</class>
  </hibernate-mapping>

Здесь маршруты и автобусные остановки имеют много-много взаимосвязей, и у каждого автобуса есть маршрут.Я просто сохраняю идентификатор маршрута в автобусе, но затем, получая объект шины, выдает следующую ошибку

com.google.gwt.user.client.rpc.SerializationException: Тип 'org.datanucleus.sco.backed.ArrayList' не был включен в набор типов, которые могут быть сериализованы этим SerializationPolicy, или его объект Class не может быть загружен.В целях безопасности этот тип не будет сериализован .: экземпляр

Во время хранения не возникает проблем.Теперь я не имею дело непосредственно с ArrayList в объекте Bus.Так что я не могу понять, где манипулировать объектом ArrayList datanucleus, чтобы использовать ArrayList.

Более того, когда я сохраняю идентификатор busstop в таблице шин вместо идентификатора маршрута, программа работает нормально.После получения объекта автобуса, я показываю его детали.При этом я получаю поле имени объекта маршрута через RouteDAO.

Пожалуйста, помогите мне ...

Ответы [ 3 ]

1 голос
/ 24 марта 2011

Решено .. Исключение возникло из-за отправки списков busStops и busStopKeys объекта Route с сервера на клиент. Списки, для которых задано значение NULL перед отправкой данных клиенту, решили проблему. У меня есть другой метод для получения списка автобусных остановок, связанных с маршрутом. Донно, если это правильный путь, но он решил проблему. Теперь перепишу код, чтобы сделать его правильным кодом JDO. Спасибо всем, кто дал их время предложить решение моей проблемы ..

0 голосов
/ 22 марта 2011

Я думаю, тебе не нужен Hibernate.Datanucleus - поставщик базы данных, который использует GAE, и он должен работать с JDO.

0 голосов
/ 22 марта 2011

Добавить

datanucleus-core-1.1.0.jar

к вашему классу. Тогда попробуйте еще раз

URL для скачивания: http://www.docjar.com/jar_detail/datanucleus-core-1.1.0.jar.html

...