2015-10-08 2 views
6

Я очень новичок в iOS, перейдя с разработки Android.Сериализация класса Swift для JSON с использованием J2ObjC и библиотеки GSON

У нас есть Android-приложение, которое имеет несколько библиотек, которые мы используем J2ObjC перевести на Objective C.

Я постепенно доводя над библиотеками и до сих пор, так хорошо.

Однако после перевода библиотеки GSON Google, у меня есть вопрос, где, если я пытаюсь использовать переведенный метод toJsonWithId я встречаю проблемы:

let gson = ComGoogleGsonGson() 
    let swiftTest = GsonSwiftTest() 
    swiftTest.name = "Ricky" 
    print(gson.toJsonWithId(swiftTest)) 

я получаю следующую ошибку:

libc++abi.dylib: terminating with uncaught exception of type JavaLangAssertionError

Далее он показывает:

Terminating app due to uncaught exception 'JavaLangAssertionError', reason: 'unknown Java type encoding'

Мой класс Swift:

import Foundation 

@objc 
public class GsonSwiftTest : NSObject { 

    var name:String? 

} 

Если я вместо этого использовать Objective класса C в моем Swift проекта, добавьте его в обводном заголовок и использовать Objective класса C это работает отлично.

Я считаю, что это недоразумение с моей стороны, но я не могу найти ответ о том, почему это не сработает. Проверка исходного кода J2ObjC показывает, что ошибка возникает, когда тип класса не найден.

Если кто-нибудь может объяснить причины этой проблемы, было бы полезно.

Спасибо!

ответ

4

Существует гораздо более простой способ сериализации экземпляров Swift: непосредственно используйте NSHSONSerialization класса Foundation. Вот соответствующая запись в блоге: JSON Serialization in Swift.

Причина, по которой ваш тест не работает в Swift, заключается в том, что не все классы Swift расширяют NSObject, который j2objc сопоставляет с java.lang.Object. Все Java-схемы сериализации предполагают/требуют, чтобы все классы расширяли Object, как в Java.

Для кросс-платформенного API я рекомендую создать простой интерфейс serialize/unserialize, а затем реализовать его один раз для Android с помощью GSON, а затем изначально использовать NSJSONSerialization. Быстро развивается быстро, поэтому, если станет доступнее новый механизм сериализации, ваш проект может легко воспользоваться им, не затрагивая порт Android.

+1

Спасибо Том, я знал о NSJSONSerialization, я просто хотел понять причину неудачи, которую вы теперь объяснили. Спасибо за вашу тяжелую работу в библиотеке. – Ricky