我试图序列化一个类,我有一个位图变量。这是有点工作的代码....我需要帮助才能找出仍然存在的问题.....
private Bitmap myVideoScreenshotBm;
private void writeObject(ObjectOutputStream out) throws IOException{
out.writeInt(myVideoScreenshotBm.getRowBytes());
out.writeInt(myVideoScreenshotBm.getHeight());
out.writeInt(myVideoScreenshotBm.getWidth());
int bmSize = myVideoScreenshotBm.getHeight() * myVideoScreenshotBm.getRowBytes();
ByteBuffer dst= ByteBuffer.allocate(bmSize);
myVideoScreenshotBm.copyPixelsToBuffer(dst);
byte[] bytesar=new byte[bmSize];
dst.position(0);
dst.get(bytesar);
out.write(bytesar);
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException{
int nbRowBytes=in.readInt();
int height=in.readInt();
int width=in.readInt();
//
int bmSize = nbRowBytes * height;
byte[] toread= new byte[bmSize];
in.read(toread, 0, toread.length);
ByteBuffer dst= ByteBuffer.allocate(bmSize);
dst.put(toread);
dst.position(0);
myVideoScreenshotBm=Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8);
myVideoScreenshotBm.copyPixelsFromBuffer(dst);
}
我没有收到错误,但我得到的位图错了...另外,我不知道如何知道哪个Bitmap.Config标志适合...怎么知道?
任何帮助?
答案 0 :(得分:13)
以下是带内存优化的序列化代码。我正在使用一个增长到最大位图大小的静态缓冲区,并且我每次都重复使用。
public class Video implements Serializable{
public long videoId;
public String title;
public String publisher;
public String language;
public Date lastModified;
public Date published;
public String imageUrl;
public String url;
public Bitmap myVideoScreenshotBm;
public Date expireTime;
//public Drawable myVideoScreenshotDrawable;
private static ByteBuffer dst;
private static byte[] bytesar;
public Video (long newVideoId) {
this.videoId=newVideoId;
}
private void writeObject(ObjectOutputStream out) throws IOException{
out.writeLong(videoId);
out.writeObject(title);
out.writeObject(publisher);
out.writeObject(language);
out.writeObject(lastModified);
out.writeObject(published);
out.writeObject(expireTime);
out.writeObject(imageUrl);
out.writeObject(url);
out.writeInt(myVideoScreenshotBm.getRowBytes());
out.writeInt(myVideoScreenshotBm.getHeight());
out.writeInt(myVideoScreenshotBm.getWidth());
int bmSize = myVideoScreenshotBm.getRowBytes() * myVideoScreenshotBm.getHeight();
if(dst==null || bmSize > dst.capacity())
dst= ByteBuffer.allocate(bmSize);
out.writeInt(dst.capacity());
dst.position(0);
myVideoScreenshotBm.copyPixelsToBuffer(dst);
if(bytesar==null || bmSize > bytesar.length)
bytesar=new byte[bmSize];
dst.position(0);
dst.get(bytesar);
out.write(bytesar, 0, bytesar.length);
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException{
videoId=in.readLong();
title=(String) in.readObject();
publisher=(String) in.readObject();
language=(String) in.readObject();
lastModified=(Date) in.readObject();
published=(Date) in.readObject();
expireTime=(Date) in.readObject();
imageUrl = (String) in.readObject();
url = (String) in.readObject();
int nbRowBytes=in.readInt();
int height=in.readInt();
int width=in.readInt();
int bmSize=in.readInt();
if(bytesar==null || bmSize > bytesar.length)
bytesar= new byte[bmSize];
int offset=0;
while(in.available()>0){
offset=offset + in.read(bytesar, offset, in.available());
}
if(dst==null || bmSize > dst.capacity())
dst= ByteBuffer.allocate(bmSize);
dst.position(0);
dst.put(bytesar);
dst.position(0);
myVideoScreenshotBm=Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
myVideoScreenshotBm.copyPixelsFromBuffer(dst);
//in.close();
}
}
答案 1 :(得分:4)
不需要冗余数组+所有的逻辑+使用给定的方法来操作缓冲区+ utf更适合字符串并避免强制转换+同步(但它不是线程安全的):
private synchronized void writeObject(final ObjectOutputStream out) throws IOException {
out.writeUTF(title);
out.writeUTF(url_friendly_name);
out.writeUTF(creator_name);
out.writeUTF(version);
out.writeUTF(package_name);
out.writeUTF(contact_website);
out.writeInt(popularity);
out.writeUTF(inconditional_redirect == null ? "" : inconditional_redirect);
out.writeUTF(custom_description == null ? "" : custom_description);
out.writeInt(icon.getRowBytes());
out.writeInt(icon.getHeight());
out.writeInt(icon.getWidth());
out.writeInt(icon.getConfig().ordinal());
final int bmSize = icon.getRowBytes() * icon.getHeight();
if (dst == null || bmSize > dst.capacity()) {
dst = ByteBuffer.allocate(bmSize);
}
dst.rewind();
icon.copyPixelsToBuffer(dst);
dst.flip();
out.write(dst.array(), 0, bmSize);
}
private synchronized void readObject(final ObjectInputStream in) throws IOException, ClassNotFoundException {
title = in.readUTF();
url_friendly_name = in.readUTF();
creator_name = in.readUTF();
version = in.readUTF();
package_name = in.readUTF();
contact_website = in.readUTF();
popularity = in.readInt();
inconditional_redirect = in.readUTF();
custom_description = in.readUTF();
final int nbRowBytes = in.readInt();
final int height = in.readInt();
final int width = in.readInt();
final Bitmap.Config config = Bitmap.Config.values()[in.readInt()];
final int bmSize = nbRowBytes * height;
if (dst == null || bmSize > dst.capacity()) {
dst = ByteBuffer.allocate(bmSize);
}
dst.rewind();
in.read(dst.array(), 0, bmSize);
icon = Bitmap.createBitmap(width, height, config);
icon.copyPixelsFromBuffer(dst);
}
答案 2 :(得分:4)
为了简化操作,您可以对位图以外的所有字段使用标准序列化。只需将位图标记为瞬态,然后使用out.defaultWriteObject();和in.defaultReadObject();.这真的清理了代码:
private String title;
private String description;
private transient Bitmap icon;
private synchronized void writeObject(final ObjectOutputStream out)
throws IOException {
// Serialize everything but the image
out.defaultWriteObject();
// Now serialize the image
out.writeInt(icon.getRowBytes());
out.writeInt(icon.getHeight());
out.writeInt(icon.getWidth());
out.writeInt(icon.getConfig().ordinal());
final int bmSize = icon.getRowBytes() * icon.getHeight();
if (dst == null || bmSize > dst.capacity()) {
dst = ByteBuffer.allocate(bmSize);
}
dst.rewind();
icon.copyPixelsToBuffer(dst);
dst.flip();
out.write(dst.array(), 0, bmSize);
}
private void readObject(ObjectInputStream in) throws IOException,
ClassNotFoundException {
// Read everything but the image
in.defaultReadObject();
// Now read the image
final int nbRowBytes = in.readInt();
final int height = in.readInt();
final int width = in.readInt();
final Bitmap.Config config = Bitmap.Config.values()[in.readInt()];
final int bmSize = nbRowBytes * height;
if (dst == null || bmSize > dst.capacity()) {
dst = ByteBuffer.allocate(bmSize);
}
dst.rewind();
in.read(dst.array(), 0, bmSize);
icon = Bitmap.createBitmap(width, height, config);
icon.copyPixelsFromBuffer(dst);
}