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

简介:
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;
     }
 }



相关文章
|
5月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
277 1
|
5月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
296 1
|
9月前
|
存储 Java 编译器
说一说关于序列化/反序列化中的细节问题
我是小假 期待与你的下一次相遇 ~
171 1
|
9月前
|
JSON Java 数据库连接
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
362 1
|
8月前
|
监控 Android开发 数据安全/隐私保护
批量发送短信的平台,安卓群发短信工具插件脚本,批量群发短信软件【autojs版】
这个Auto.js脚本实现了完整的批量短信发送功能,包含联系人管理、短信内容编辑、发送状态监控等功能
|
10月前
|
存储 安全 IDE
说一说序列化与反序列化中存在的问题
本文详细解析了Java中的序列化机制,包括序列化的概念、实现方式及应用场景。通过Student类的实例演示了对象的序列化与反序列化过程,并分析了`Serializable`接口的作用以及`serialVersionUID`的重要意义。此外,文章还探讨了如何通过自定义`readObject()`方法增强序列化的安全性,以及解决可序列化单例模式中可能产生的多实例问题。最后提供了代码示例和运行结果,帮助读者深入理解序列化的原理与实践技巧。
256 2
|
10月前
|
JSON JavaScript 前端开发
Go语言JSON 序列化与反序列化 -《Go语言实战指南》
本文介绍了 Go 语言中使用 `encoding/json` 包实现 JSON 与数据结构之间的转换。内容涵盖序列化(`Marshal`)和反序列化(`Unmarshal`),包括基本示例、结构体字段标签的使用、控制字段行为的标签(如 `omitempty` 和 `-`)、处理 `map` 和切片、嵌套结构体序列化、反序列化未知结构(使用 `map[string]interface{}`)以及 JSON 数组的解析。最后通过表格总结了序列化与反序列化的方法及类型要求,帮助开发者快速掌握 JSON 数据处理技巧。
|
12月前
|
存储 编解码 监控
Android平台GB28181执法记录仪技术方案与实现
本文介绍了大牛直播SDK的SmartGBD在执法记录仪场景中的应用。GB28181协议作为视频监控联网的国家标准,为设备互联互通提供规范。SmartGBD专为Android平台设计,支持音视频采集、编码与传输,具备自适应算法和多功能扩展优势。文章分析了执法记录仪的需求,如实时音视频传输、设备管理及数据安全,并详细阐述了基于SmartGBD的技术实现方案,包括环境准备、SDK集成、设备注册、音视频处理及功能扩展等步骤。最后展望了SmartGBD在未来智慧物联领域的广阔应用前景。
750 13
|
12月前
|
存储 编解码 开发工具
Android平台毫秒级低延迟HTTP-FLV直播播放器技术探究与实现
本文详细探讨了在Android平台上实现HTTP-FLV播放器的过程。首先介绍了FLV格式的基础,包括文件头和标签结构。接着分析了HTTP-FLV传输原理,通过分块传输实现流畅播放。然后重点讲解了播放器的实现步骤,涵盖网络请求、数据解析、音视频解码与渲染,以及播放控制功能的设计。文章还讨论了性能优化和网络异常处理的方法,并总结了HTTP-FLV播放器的技术价值,尤其是在特定场景下的应用意义。
633 11