将继承的 class 对象存储在代号一存储中
Store inherited class object in codename one storage
我在 java 中使用 codenameone 框架。
我在保存 class 农民继承自 class 人的对象列表时遇到了一个严重的问题。 class 都实现了 externalizable 接口,我也在两个 classes 中正确地实现了四个必需的方法(getVersion、externalize、internalize、getObjectId)。我调用 super.initialize() 作为 farmer class 初始化方法的第一行,并且对外部化方法也做同样的事情。
我可以保存一个列表,但在关闭并重新启动模拟器后我似乎无法从存储中读取它。它只是给了我一个列表,其中第一个元素是 Farmer,而其他元素是 null.or 日期值。
几天来我一直在寻找解决方案。如果您有任何提示或建议,我们将不胜感激。提前谢谢你。
我猜你是这样实现这个方法的:
public String getObjectId() {
return getClass().getName();
}
而不是像这样:
public String getObjectId() {
return "MyObject";
}
您需要为 class 提供唯一的每个对象名称,并且需要对其进行硬编码,因为 class 由于混淆,设备上的名称可能不同。
下面是 Person 的方法 class
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
的农民 class 的方法来了
@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());
}
}
我在 java 中使用 codenameone 框架。 我在保存 class 农民继承自 class 人的对象列表时遇到了一个严重的问题。 class 都实现了 externalizable 接口,我也在两个 classes 中正确地实现了四个必需的方法(getVersion、externalize、internalize、getObjectId)。我调用 super.initialize() 作为 farmer class 初始化方法的第一行,并且对外部化方法也做同样的事情。
我可以保存一个列表,但在关闭并重新启动模拟器后我似乎无法从存储中读取它。它只是给了我一个列表,其中第一个元素是 Farmer,而其他元素是 null.or 日期值。
几天来我一直在寻找解决方案。如果您有任何提示或建议,我们将不胜感激。提前谢谢你。
我猜你是这样实现这个方法的:
public String getObjectId() {
return getClass().getName();
}
而不是像这样:
public String getObjectId() {
return "MyObject";
}
您需要为 class 提供唯一的每个对象名称,并且需要对其进行硬编码,因为 class 由于混淆,设备上的名称可能不同。
下面是 Person 的方法 class
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
的农民 class 的方法来了@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());
}
}