如何序列化像Objective-C中的缓冲区对象之类的数据以供NativeScript使用

在努力为NativeScript插件添加跨平台支持时,该插件的某些区域将需要保留Object状态。这意味着在给定的时间,需要保留数据状态并将其存储在NativeScript(TypesScript / JavaScript)中,并在不破坏数据的情况下将其恢复。

尽管在许多用于插件的Android方面的JAVA库中,这似乎很简单,但是我不确定如何为iOS开发复制该函数。

a6733525 回答:如何序列化像Objective-C中的缓冲区对象之类的数据以供NativeScript使用

在线研究此主题可能会导致各种答案,其中大多数似乎要求开发人员在给定的Object / Class上创建特定方法以支持序列化。

选项1-NSCoding协议

NSCoding协议Source (Apple)声明了一个类必须实现的两个方法,以便可以对该类的实例进行编码和解码。此功能为归档(将对象和其他结构存储在磁盘上)和分发(将对象复制到不同的地址空间)提供了基础。

提到的两种方法是:

- (void) encodeWithCoder:(NSCoder*)encoder;
- (id) initWithCoder:(NSCoder*)decoder;

尽管这在大多数情况下可行,但这将需要NativeScript开发人员找出一种方法来为iOS库(可能是pod包)创建另一个包装。这比实际需要的更多,而且在大多数情况下可能无法使用。

选项2-NSKeyedArchiver / NSKeyedUnarchiver

NSKeyedArchiver和随附的NSKeyedUnarchiver协议提供了一种将对象(和标量值)编码/解码为独立于体系结构的方式,适合存储在文件中。

此选项似乎不那么麻烦,并且允许将已归档的对象转换为在base64等环境之间共享的东西:

declare var NSDataBase64EncodingEndLineWithLineFeed;
declare var NSDataBase64DecodingIgnoreUnknownCharacters;

// archive class instance as base64 string
const archivedObject = NSKeyedArchiver.archivedDataWithRootObject(someClassInstance);
const base64Archive = archivedObject.base64EncodedStringWithOptions(NSDataBase64EncodingEndLineWithLineFeed);

// unarchive back into a class instance
const rawData = NSData.alloc().initWithBase64EncodedStringOptions(base64Archive,NSDataBase64DecodingIgnoreUnknownCharacters);
const newClassInstance = NSKeyedUnarchiver.unarchivedObjectOfClassFromDataError(NSObject,rawData);

我能够从时间流逝的旧文章中学习这两个概念(但值得庆幸的是,由于WayBackMachine而得以保存)— CocoaHeads - NSCoding

除了上述信息之外,我相信还可以使用NativeScript扩展现有的ObjC类并添加所需的encodeWithCoderinitWithCoder方法。虽然我不需要执行此操作或尝试进行此操作,但是如果我自己或其他人碰巧尝试了此操作并取得了不错的效果,请告诉我,我将在此处添加该示例。

有关通过扩展NativeScript中的Objective-C类创建子类的更多信息,请查看以下源: https://docs.nativescript.org/core-concepts/ios-runtime/how-to/ObjC-Subclassing

有关NativeScript中的Objective-C类的更多信息,请在此处阅读:https://docs.nativescript.org/core-concepts/ios-runtime/types/ObjC-Classes

本文链接:https://www.f2er.com/3048109.html

大家都在问