package com.convenient.android.common.utils.string

import android.util.Base64
import com.convenient.android.common.utils.file.CloseUtils
import java.io.*

/**
 *    @author : hubowen
 *    @date   : 2020/10/19  1:56 PM
 *    @description：
 */

object SerializableUtil {

    /**
     * @param list
     * @return
     * @throws IOException
     * @方法说明:将集合转换成String类型
     * @方法名称:listToString
     * @返回值:String
     */
    fun <E> listToString(list: List<E>?): String {
        var baos: ByteArrayOutputStream? = null
        var oos: ObjectOutputStream? = null
        var listString = ""
        try {
            // 实例化一个ByteArrayOutputStream对象，用来装载压缩后的字节文件
            baos = ByteArrayOutputStream()
            // 然后将得到的字符数据封装到ObjectOutputStream(baos)
            oos = ObjectOutputStream(baos)
            // writeObject 方法负责写入特定类的对象的状态，以便相应的readObject可以还原他
            oos.writeObject(list)
            // 最后，用Base64.encode将字节文件转换成Base64编码，并以String形式保存
            listString = Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT)
        } catch (e: Exception) {
            e.printStackTrace()
        } finally {
            CloseUtils.closeIO(oos, baos)
        }
        return listString.trim { it <= ' ' }
    }

    /**
     * @return
     * @throws IOException
     * @方法说明:将数组转换成String类型
     * @方法名称:listToString
     * @返回值:String
     */
    fun mapToString(map: Map<Any, Any>?): String {
        var baos: ByteArrayOutputStream? = null
        var oos: ObjectOutputStream? = null
        var listString = ""
        try {
            // 实例化一个ByteArrayOutputStream对象，用来装载压缩后的字节文件
            baos = ByteArrayOutputStream()
            // 然后将得到的字符数据封装到ObjectOutputStream(baos)
            oos = ObjectOutputStream(baos)
            // writeObject 方法负责写入特定类的对象的状态，以便相应的readObject可以还原他
            oos.writeObject(map)
            // 最后，用Base64.encode将字节文件转换成Base64编码，并以String形式保存
            listString = Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT)
        } catch (e: Exception) {
            e.printStackTrace()
        } finally {
            CloseUtils.closeIO(oos, baos)
        }
        return listString.trim { it <= ' ' }
    }

    /**
     * @param obj
     * @return
     * @throws IOException
     * @方法说明:将对象转换成String类型
     * @方法名称:objToStr
     * @返回值:String
     */
    @Deprecated("")
    fun objToStr(obj: Any?): String {
        if (obj == null) {
            return ""
        }
        var baos: ByteArrayOutputStream? = null
        var oos: ObjectOutputStream? = null
        var listString = ""
        try {
            // 实例化一个ByteArrayOutputStream对象，用来装载压缩后的字节文件
            baos = ByteArrayOutputStream()
            // 然后将得到的字符数据装载到ObjectOutputStream
            oos = ObjectOutputStream(baos)
            // writeObject 方法负责写入特定类的对象的状态，以便相应的readObject可以还原它
            oos.writeObject(obj)
            // 最后，用Base64.encode将字节文件转换成Base64编码，并以String形式保存
            listString = Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT)
        } catch (e: Exception) {
            e.printStackTrace()
        } finally {
            CloseUtils.closeIO(oos, baos)
        }
        return listString.trim { it <= ' ' }
    }

    /**
     * @param str
     * @return
     * @throws StreamCorruptedException
     * @throws IOException
     * @方法说明:将String转换成Obj
     * @方法名称:strToObj
     * @返回值:Object
     */
    @Deprecated("")
    @Throws(IOException::class)
    fun <T> strToObj(str: String?): T? {
        var ois: ObjectInputStream? = null
        var bais: ByteArrayInputStream? = null
        try {
            val mByte = Base64.decode(str, Base64.DEFAULT)
            bais = ByteArrayInputStream(mByte)
            ois = ObjectInputStream(bais)
            return ois.readObject() as? T
        } catch (e: Exception) {
            e.printStackTrace()
        } finally {
            CloseUtils.closeIO(ois, bais)
        }
        return null
    }

    /**
     * @param str
     * @return
     * @throws StreamCorruptedException
     * @throws IOException
     * @方法说明:将String转换成List<E>
     * @方法名称:strToList
     * @返回值:List<E>
    </E></E> */
    @Throws(IOException::class)
    fun <E> strToList(str: String?): ArrayList<E>? {
        val mByte = Base64.decode(str, Base64.DEFAULT)
        var bais: ByteArrayInputStream? = ByteArrayInputStream(mByte)
        var ois: ObjectInputStream? = null
        var stringList: ArrayList<E>? = null
        try {
            ois = ObjectInputStream(bais)
            stringList = ois.readObject() as ArrayList<E>
        } catch (ignored: Exception) {
        } finally {
            CloseUtils.closeIO(ois, bais)
        }
        return stringList
    }

    /**
     * @param str
     * @return
     * @throws StreamCorruptedException
     * @throws IOException
     * @方法说明:将String转换成List<E>
     * @方法名称:strToList
     * @返回值:List<E>
    </E></E> */
    @Throws(IOException::class)
    fun strToMap(str: String?): Map<*, *>? {
        val mByte = Base64.decode(str, Base64.DEFAULT)
        var bais: ByteArrayInputStream? = ByteArrayInputStream(mByte)
        var ois: ObjectInputStream? = null
        var stringList: Map<*, *>? = null
        try {
            ois = ObjectInputStream(bais)
            stringList = ois.readObject() as Map<*, *>
        } catch (ignored: Exception) {
        } finally {
            CloseUtils.closeIO(ois, bais)
        }
        return stringList
    }
}