Android平台实现位图(Bitmap)的序列化和反序列化

简介:

2000元阿里云代金券免费领取,2核4G云服务器仅664元/3年,新老用户都有优惠,立即抢购>>>


阿里云采购季(云主机223元/3年)活动入口:请点击进入>>>,


阿里云学生服务器(9.5元/月)购买入口:请点击进入>>>,

android整个上层java开发框架可以分为四个方面:界面(activity和appwidget)、消息(Intent和Message)、服务(Service)和数据(Sqllite、Content Provider)。

1.新的序列化方式:

android提供了一种新的类型:Parcel。本类被用作封装数据的容器,封装后的数据可以通过Intent或IPC传递。

除了基本类型以外,只有实现了Parcelable接口的类才能被放入Parcel中。

Parcelable实现要点:需要实现三个东西

1)writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中.声明如下:

writeToParcel (Parcel dest, int flags) 具体参数含义见javadoc

2)describeContents方法。没搞懂有什么用,反正直接返回0也可以

3)静态的Parcelable.Creator接口,本接口有两个方法:

createFromParcel(Parcel in) 实现从in中创建出类的实例的功能

newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。估计本方法是供外部类反序列化本类数组使用。

示例:

需求:我们经常需要在多个部件(activity或service)之间通过Intent传递一些数据,简单类型(如数字、字符串)的可以直接放入Intent。复杂类型(例如,J2ee中的Bean)的必须实现Parcelable接口。示例如下:

package breakan.serializable;
 
  import java.io.ByteArrayOutputStream;
  import java.io.FileInputStream;
  import java.io.FileOutputStream;
  import java.io.ObjectInputStream;
  import java.io.ObjectOutputStream;
  import java.io.Serializable;
 
  import android.app.Activity;
  import android.graphics.Bitmap;
  import android.graphics.BitmapFactory;
  import android.graphics.Bitmap.CompressFormat;
  import android.graphics.drawable.BitmapDrawable;
  import android.os.Bundle;
  import android.widget.ImageView;
  import android.widget.TextView;
 
  public class SerializableActivity extends Activity {
     private Bitmap bitmap = null;
     private ObjectOutputStream oos = null;
     private ObjectInputStream ois = null;
     // myBitmap1是要被序列化的对象
     private MyBitmap myBitmap1 = null;
     // myBitmap2是反序列化后得到的对象
     private MyBitmap myBitmap2 = null;
     private TextView tv1 = null;
     private ImageView img1 = null;
 
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
         bitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.icon))
                 .getBitmap();
         myBitmap1 = new MyBitmap(BytesBitmap.getBytes(bitmap), "icon.png");
         tv1 = (TextView) findViewById(R.id.tv1);
         img1 = (ImageView) findViewById(R.id.img1);
 
         try {
             // 序列化myBitmap对象
             oos = new ObjectOutputStream(new FileOutputStream(
                     "/data/data/breakan.serializable/bitmap.bin"));
             oos.writeObject(myBitmap1);
             oos.flush();
             // 反序列化myBitmap对象
             ois = new ObjectInputStream(new FileInputStream(
                     "/data/data/breakan.serializable/bitmap.bin"));
             myBitmap2 = (MyBitmap) ois.readObject();
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
             try {
                 if (oos != null) {
                     oos.close();
                 }
                 if (ois != null) {
                     ois.close();
                 }
             } catch (Exception e) {
                 e.printStackTrace();
             }
         }
 
         tv1.setText(myBitmap2.getName());
         img1.setImageBitmap(BytesBitmap.getBitmap(myBitmap2.getBitmapBytes()));
     }
 
 }
 
 /**
  * 因为Bitmap没有实现序列化,所以不能直接在序列化类(MyBitmap)中使用
  * BytesBitmap用于实现Bitmap和byte[]间的相互转换
  * @author joran
  * 
  */
 class BytesBitmap {
     public static Bitmap getBitmap(byte[] data) {
         return BitmapFactory.decodeByteArray(data, 0, data.length);
     }
 
     public static byte[] getBytes(Bitmap bitmap) {
         ByteArrayOutputStream baops = new ByteArrayOutputStream();
         bitmap.compress(CompressFormat.PNG, 0, baops);
         return baops.toByteArray();
     }
 }
 
 /**
  * MyBitmap是要被序列化的类
  * 其中包含了通过BytesBitmap类得到的Bitmap中数据的数组
  * 和一个保存位图的名字的字符串,用于标识图片
  * @author joran
  *
  */
 class MyBitmap implements Serializable {
     /**
      * serialVersionUID解释:
      * http://www.blogjava.net/invisibletank/archive/2007/11/15/160684.html
      */
     private static final long serialVersionUID = 1L;
     private byte[] bitmapBytes = null;
     private String name = null;
 
     public MyBitmap(byte[] bitmapBytes, String name) {
         // TODO Auto-generated constructor stub
         this.bitmapBytes = bitmapBytes;
         this.name = name;
     }
 
     public byte[] getBitmapBytes() {
         return this.bitmapBytes;
     }
 
     public String getName() {
         return this.name;
     }
 }



相关文章
|
16天前
|
Android开发
Android MediaTek 平台增加UART接口的红外模块支持,支持NEC红外遥控
Android MediaTek 平台增加UART接口的红外模块支持,支持NEC红外遥控
12 0
|
2月前
|
存储 XML JSON
数据传输的艺术:深入探讨序列化与反序列化
数据传输的艺术:深入探讨序列化与反序列化
56 0
|
2月前
|
存储 C#
C#中的序列化和反序列化
C#中的序列化和反序列化
12 0
|
2月前
|
API 开发工具 Android开发
iOS 和 Android 平台的开发有哪些主要区别?
iOS与Android开发区别:iOS用Objective-C/Swift,App Store唯一下载渠道;Android用Java/Kotlin,多商店发布(如Google Play、华为市场)。设计上,iOS简洁一致,Android灵活可定制。开发工具,iOS用Xcode,Android用Android Studio。硬件和系统多样性,iOS统一,Android复杂。权限管理、审核流程及API各有特点,开发者需依据目标平台特性进行选择。
36 3
|
1月前
|
JSON 安全 Java
Spring Boot 序列化、反序列化
本文介绍了Spring Boot中的序列化和反序列化。Java提供默认序列化机制,通过实现Serializable接口实现对象到字节流的转换。Spring Boot默认使用Jackson处理JSON,可通过注解和配置自定义规则。然而,序列化可能引发安全问题,建议使用白名单、数据校验和安全库。最佳实践包括使用标准机制、自定义规则及注意版本控制。文章还提醒关注性能并提供了相关参考资料。
44 2
|
1天前
|
JSON Java Linux
【探索Linux】P.30(序列化和反序列化 | JSON序列化库 [ C++ ] )
【探索Linux】P.30(序列化和反序列化 | JSON序列化库 [ C++ ] )
16 2
|
1天前
|
开发工具 Android开发
rk平台Android12屏幕永不休眠
rk平台Android12屏幕永不休眠
10 1
|
1天前
|
Android开发
Android 高通平台集成无源码apk示例
Android 高通平台集成无源码apk示例
6 0
|
1天前
|
Android开发
关于高通Android 平台上qssi的介绍
关于高通Android 平台上qssi的介绍
5 0
|
2天前
|
XML 存储 JSON
[计算机网络]---序列化和反序列化
[计算机网络]---序列化和反序列化
http://www.vxiaotou.com