【问题标题】:Store inherited class object in codename one storage将继承的类对象存储在代号一存储中
【发布时间】:2016-06-06 17:55:52
【问题描述】:

我在 java 中使用 codenameone 框架。 保存从类 Person 继承的类农夫​​的对象列表是一个严重的问题。这两个类都实现了可外部化接口,并且我在这两个类中也正确实现了四个必需的方法(getVersion、externalize、internalize、getObjectId)。我将 super.initialize() 调用为农夫类中初始化方法的第一行,并为 externalize 方法做同样的事情。

我可以保存一个列表,但在关闭并重新启动模拟器后我似乎无法从存储中读取它。它只是给了我一个列表,其中第一个元素是 Farmer,但其他元素是 null.or Date 值。

这几天我一直在寻找解决方案。您将非常感谢任何提示或建议。提前谢谢你。

【问题讨论】:

    标签: java storage codenameone


    【解决方案1】:

    我猜你是这样实现这个方法的:

    public String getObjectId() {
       return getClass().getName();
    }
    

    而不是这样:

    public String getObjectId() {
       return "MyObject";
    }
    

    您需要为一个类指定一个唯一的每个对象名称,并且需要对其进行硬编码,因为由于混淆,设备上的类名称可能会有所不同。

    【讨论】:

    • 感谢 Shai 的快速回答。我已经按照您建议的方式实现了 getObjectId 方法,但我仍然遇到错误。我在农民类中返回“农民”,在人员类中返回“人”。由于我没有存储 Person 的实例,它甚至应该以与其他类相同的方式实现 Externalizable 吗?我还有一个属性,它是农民拥有的字段列表,类型是 java.util.List 。我在两个类中都有其他特定的类对象属性,但都正确注册。你还有其他想法为什么我可能会遇到这样的问题?
    • 您是否使用 util 类注册了两者?你把注册码放在哪里了?
    • 是的,我确实使用 Util 类注册了两个类,并且代码在 initVars 方法中(这是一个 gui bluidler 项目)
    • 问题是当我将对象写入存储并在模拟器的同一执行中,我尝试读取它们它工作得很好但是当我关闭模拟器并再次启动它时,所有类对象正确地从存储中获取,除了 Farmer 和 Field 类对象
    • 在写入后尝试刷新缓存,看看这在相同的执行中是否仍然有效(存储中有一种方法)。在读/写期间查看控制台以查看是否打印了异常。
    【解决方案2】:

    这是 Person 类的方法

    public void externalize(DataOutputStream out) {
                try {
                    //Personne
                    Util.writeUTF(getNomPersonne(), out);
                    Util.writeUTF(getPrenomPersonne(), out);
                    Util.writeUTF(getAdressePersonne(), out);
                    Util.writeUTF(getLieuNaisPersonne(), out);
                    Util.writeUTF(getPhotoPersonne(), out);
                    Util.writeUTF(getSituationMatrimonialePersonne(), out);
                    Util.writeUTF(getTelPersonne(), out);
    
                    out.writeLong(getIdPersone() == null ? 0 : getIdPersone());
                    out.writeInt(getVERSION() == null ? 0 : getVERSION() );
                    out.writeChar(getSexePersonne());
    
                    Util.writeObject(getDateNaisPersonne(), out);
                    Util.writeObject(getLocalisationPersonne() , out);
                } catch (IOException ex) {
                    Dialog.show("Erreur ","L'exception "+ex.getMessage(),"Ok",null);
                }
            }
    
        public void internalize(int version, DataInputStream in){
                try {
                    nomPersonne = Util.readUTF(in);
                    prenomPersonne = Util.readUTF(in);
                    adressePersonne = Util.readUTF(in);
                    lieuNaisPersonne =  Util.readUTF(in);
                    photoPersonne = Util.readUTF(in);
                    situationMatrimonialePersonne = Util.readUTF(in);
                    telPersonne = Util.readUTF(in);
    
                    idPersone = in.readLong();
                    VERSION = in.readInt();
                    sexePersonne = in.readChar();
    
                    dateNaisPersonne = (Date) Util.readObject(in);
                    localisationPersonne = (StructureAdministrative) Util.readObject(in);
                } catch (IOException ex) {
                     Dialog.show("Erreur ","L'exception "+ex.getMessage(),"Ok",null);
                }
            }
    

    继承自 Person 的农夫类的方法来了

    @Override
        public void externalize(DataOutputStream out) {
            try {
                //Personne
                super.externalize(out);
                //Agriculteur
                Util.writeUTF(this.getNumPieceIdentite(), out);
                Util.writeUTF(this.getPhotoPieceIdentite(), out);
                Util.writeUTF(this.getPhotoPieceRecto(), out);
                Util.writeUTF(this.getPhotoPieceVerso(), out);
                Util.writeUTF(this.getTelAgripme(), out);
    
                out.writeInt(this.getNombreEnfant() == null ? 0 : this.getNombreEnfant()  );
                out.writeInt(getTailleMenage() == null ? 0 : getTailleMenage());
                out.writeDouble(getDistanceParcourue() == null ? 0 : getDistanceParcourue());
                out.writeDouble(getDureeAttente() == null ? 0 : getDureeAttente());
                out.writeBoolean(getaPiece() == null ? false : getaPiece());
                out.writeBoolean(getMembreCooperative() == null ? false : getMembreCooperative());
                out.writeInt(getParidPersone() == null ? 0 : getParidPersone());
    
    
                Util.writeObject(getDateExpirPiece(), out);
                Util.writeObject(getTypePieceIdentite(), out);
                Util.writeObject(getTypeProprieteFoncier() , out);
                Util.writeObject(getListeChamps(), out);
            } catch (IOException ex) {
                System.out.println("ERREUR DE L'ECRITURE DES AGRICULTEUR EST"+ ex.getMessage());
            }
        }
    
    @Override
    public void internalize(int version, DataInputStream in)  {
        try {
            //Personne
            super.internalize(version, in);
            //Agriculteur
            numPieceIdentite = Util.readUTF(in);
            photoPieceIdentite = Util.readUTF(in);
            photoPieceRecto = Util.readUTF(in);
            photoPieceVerso = Util.readUTF(in);
            telAgripme = Util.readUTF(in);
    
            nombreEnfant = in.readInt();
            tailleMenage = in.readInt();
            distanceParcourue = in.readFloat();
            dureeAttente = in.readFloat();
            aPiece = in.readBoolean();
            membreCooperative = in.readBoolean();
            ParidPersone = in.readInt();
    
    
            dateExpirPiece = (Date) Util.readObject(in);
            typePieceIdentite = (TypePieceIdentite) Util.readObject(in);
            typeProprieteFoncier = (TypeProprieteFoncier) Util.readObject(in);
            listeChamps = (ArrayList<Champ>) Util.readObject(in);
        } catch (IOException ex) {
            System.out.println("LA LECTURE DES AGRICULTEURS DE LA BASE A TEL PROBLÈME "+ ex.getMessage());
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多