Как преобразовать мои значения String в пользовательский тип в kotlin? - PullRequest
0 голосов
/ 13 октября 2018

У меня есть приложение для Android, мне нужно сохранить значение в общих настройках в Android с помощью Kotlin.Пример кода ниже.

Мое значение: AppdatabaseIMP @ 43b8de6 ------- это тип Appdatabase, поэтому я преобразую в строку, подобную этой val APPDBSTR = appDatabase.toString()

сохранить:

val pref = cc.getApplicationContext().getSharedPreferences("MyPrefdd", 0)
val editor = pref.edit()
editor.putString("APPDBSTR", APPDBSTR)
editor.apply()

получить:

val pref = context!!.getSharedPreferences("MyPrefdd", 0)
val mFragAPPDBSTR = pref.getString("APPDBSTR", null)

здесь я могу получить значение без проблемы, но я хочу повторно преобразовать мою строку вprevius введите как это сделать в kotlin

ОБНОВЛЕНИЕ:

companion object {
        /**
         * new instance pattern for fragment
         */
        @JvmStatic
        fun newInstance(myObject: List<TransactionEntity>?, cc: Context, appDatabase: AppDatabase, networkDefinitionProvider: NetworkDefinitionProvider, incoming: TransactionAdapterDirection): SendingFragment {

            val gson = Gson()
            val gson1 = GsonBuilder().create()
            val model = myObject as List<TransactionEntity>
            val IT = gson.toJson(model)
            System.out.println("json representation :" + IT)

            val bo = ByteArrayOutputStream()
        val so = ObjectOutputStream(bo)
        so.writeObject(appdatabase)
        so.flush()
        val serializedObject = String(Base64.encode(bo.toByteArray()))

            val bundle = Bundle()
            bundle.putString("bundleValue", IT)
             bundle.putSerializable("serializedObject",serializedObject)
            val sendFragament: SendingFragment = SendingFragment()
            sendFragament.setArguments(bundle)
            return sendFragament
        }
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

        val gson = Gson()
        val gson1 = GsonBuilder().create()
        val pref = context!!.getSharedPreferences("MyPrefdd", 0)
        val mFragIT = pref.getString("NEWIT", "")

         val mFragserializedObject = arguments!!.getSerializable("serializedObject") --- i here i can the value 

        }

Я получил эту ошибку:

Caused by: java.io.NotSerializableException: com.crypto.wallet.data.AppDatabase_Impl
                                                                   at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1344)
                                                                   at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651)
                                                                   at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497)
                                                                   at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461)
                                                                   at com.crypto.wallet.activities.SendingFragment$Companion.newInstance(SendingFragment.kt:52)
                                                                   at com.crypto.wallet.activities.MainActivity.setupViewPager(MainActivity.kt:420)
                                                                   at com.crypto.wallet.activities.MainActivity.access$setupViewPager(MainActivity.kt:70)
                                                                   at com.crypto.wallet.activities.MainActivity$onCreate$outgoingTransactionsObserver$1.onChanged(MainActivity.kt:277)
                                                                   at com.crypto.wallet.activities.MainActivity$onCreate$outgoingTransactionsObserver$1.onChanged(MainActivity.kt:70)
                                                                   at android.arch.lifecycle.LiveData.considerNotify(LiveData.java:109)
                                                                   at android.arch.lifecycle.LiveData.dispatchingValue(LiveData.java:126)
                                                                   at android.arch.lifecycle.LiveData.setValue(LiveData.java:282)
                                                                   at android.arch.lifecycle.LiveData$1.run(LiveData.java:87)
                                                                   at android.os.Handler.handleCallback(Handler.java:739)
                                                                   at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                   at android.os.Looper.loop(Looper.java:135)

Как сделатьдесериализовать это?

1 Ответ

0 голосов
/ 13 октября 2018

То, что вы получаете при вызове toString, является только хэшем объекта в памяти.Он не содержит фактических значений объекта, поэтому он не может быть восстановлен таким образом.

https://developer.android.com/reference/java/lang/Object.html#toString()
Метод toString для класса Object возвращает строку, состоящую из имени классакоторый является экземпляром, символ знака @ и шестнадцатеричное представление без знака хеш-кода объекта.

Вам нужно сериализовать весь объект, чтобы восстановление работало,В зависимости от вашего класса это может быть так просто, как расширение Сериализуемый и получение String, как описано в этом ответе: https://stackoverflow.com/a/8887244/4193263

ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream so = new ObjectOutputStream(bo);
so.writeObject(myObject);
so.flush();
String serializedObject = new String(Base64.encodeBase64(bo.toByteArray()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...