gpt4 book ai didi

java - 重构后更改序列化 Java 对象的路径/类名

转载 作者:行者123 更新时间:2023-11-29 03:47:31 25 4
gpt4 key购买 nike

我启动了一个使用序列化对象 myfirstpath.UserState 保存其状态的应用。

现在我想将此对象的路径更改为 mycleanpath.UserState(相同的对象,只是路径发生变化)。这将适用于首次安装该应用程序的新用户,但对于更新该应用程序的用户,他们将丢失其状态。

有没有办法将序列化对象 myfirstpath.UserState 加载到 mycleanpath.UserState 中? (当然不在我的源代码中保留 myfirstpath.UserState)。

最佳答案

我写了一小段代码来搜索/替换包含序列化数据的文件中的旧路径/新路径。我在加载文件之前转换文件,这样我就可以将序列化类移动到新路径,而无需在旧路径中保留此类的副本。这就是您使用它的方式:

File baseDirectory = applicationContext.getFilesDir();
File file = new File( baseDirectory, "settings.data" );
if (file.exists()) {
//We have to convert it to newsettings.Data
byte[] convertedBytes = common.utils.SerializeTools.changePathInSerializedFile(file, "old.path.data", "new.path.data");

//Write converted file
File newFile = new File( baseDirectory, "newsettings.data" );
FileOutputStream fos = new FileOutputStream(newFile);
fos.write(convertedBytes);
fos.close();

//Remove old file
file.delete();
}

这是 SerializeTools.java 的代码。我在这篇很棒的博文中学习了 java 序列化格式 http://www.javaworld.com/community/node/2915 .

package common.utils;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class SerializeTools {

static public byte[] changePathInSerializedFile(File f, String fromPath, String toPath) throws IOException {
byte[] buffer = new byte[(int)f.length()];
FileInputStream in = new FileInputStream(f);
in.read(buffer);
in.close();
return SerializeTools.changePathInSerializedData(buffer,fromPath,toPath);
}

static public byte[] changePathInSerializedData(byte[] buffer, String fromPath, String toPath) throws IOException {
byte[] search = fromPath.getBytes("UTF-8");
byte[] replace = toPath.getBytes("UTF-8");

ByteArrayOutputStream f = new ByteArrayOutputStream();

for (int i=0;i<buffer.length;i++) {
//Search 2 bytes ahead to let us modify the 2 bytes length of the class name (see Serialize format http://www.javaworld.com/community/node/2915 )
boolean found=false;
int searchMaxIndex=i+search.length+2;
if (searchMaxIndex<=buffer.length) {
found=true;
for (int j=i+2;j<searchMaxIndex;j++) {
if (search[j-i-2]!=buffer[j]) {
found=false;
break;
}
}
}
if (found) {
int high=((int)(buffer[i])&0xff);
int low=((int)(buffer[i+1])&0xff);
int classNameLength=(high<<8)+low;
classNameLength+=replace.length-search.length;
//Write new length
f.write((classNameLength>>8)&0xff);
f.write((classNameLength)&0xff);
//Write replacement path
f.write(replace);
i=searchMaxIndex-1;
} else {
f.write(buffer[i]);
}
}

f.flush();
f.close();

return f.toByteArray();
}

}

关于java - 重构后更改序列化 Java 对象的路径/类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10259760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com