首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

类被序列化时,userDefualt不保存开关

当一个类被序列化时,userDefault不保存开关的原因是因为userDefault只能保存一些基本数据类型,如字符串、数字、布尔值等,无法直接保存自定义的类对象。当我们需要将一个自定义类对象保存到userDefault中时,需要先将该对象转换为NSData类型,然后再进行保存。

在iOS开发中,可以通过实现NSCoding协议来实现对象的序列化和反序列化。NSCoding协议要求实现两个方法:encode(with:)和init(coder:)。encode(with:)方法用于将对象的属性编码为NSData类型,而init(coder:)方法用于从NSData类型解码并初始化对象的属性。

以下是一个示例代码,演示了如何将一个自定义类对象保存到userDefault中:

代码语言:txt
复制
import Foundation

class MyClass: NSObject, NSCoding {
    var switchState: Bool
    
    init(switchState: Bool) {
        self.switchState = switchState
    }
    
    func encode(with coder: NSCoder) {
        coder.encode(switchState, forKey: "switchState")
    }
    
    required init?(coder: NSCoder) {
        switchState = coder.decodeBool(forKey: "switchState")
    }
}

// 将对象保存到userDefault中
let myObject = MyClass(switchState: true)
let encodedData = NSKeyedArchiver.archivedData(withRootObject: myObject)
UserDefaults.standard.set(encodedData, forKey: "myObject")

// 从userDefault中读取对象
if let decodedData = UserDefaults.standard.object(forKey: "myObject") as? Data {
    if let decodedObject = NSKeyedUnarchiver.unarchiveObject(with: decodedData) as? MyClass {
        print(decodedObject.switchState)
    }
}

在上述代码中,我们定义了一个名为MyClass的自定义类,其中包含一个名为switchState的布尔属性。该类遵循NSCoding协议,并实现了encode(with:)和init(coder:)方法。在encode(with:)方法中,我们使用NSCoder将switchState属性编码为NSData类型。在init(coder:)方法中,我们使用NSCoder从NSData类型解码并初始化switchState属性。

在保存对象时,我们使用NSKeyedArchiver将对象转换为NSData类型,并将其保存到userDefault中。在读取对象时,我们使用NSKeyedUnarchiver从userDefault中获取NSData类型数据,并将其解码为MyClass对象。

需要注意的是,这种方式只适用于保存少量的自定义类对象,如果需要保存大量的自定义类对象,建议使用其他持久化方案,如Core Data或SQLite等。

推荐的腾讯云相关产品:腾讯云对象存储(COS) 腾讯云对象存储(COS)是一种海量、安全、低成本、高可靠的云存储服务,适用于存储各类非结构化数据,如图片、音视频、文档等。它提供了简单易用的API接口和丰富的功能,可以满足各种存储需求。

产品介绍链接地址:https://cloud.tencent.com/product/cos

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

用了几年的 Fastjson,我最终替换成了Jackson!

fastjson特性说明 fastjson枚举 fastjson默认状态 jackson枚举 jackson默认状态 jackson特性说明 输出的json字段名引号包含 SerializerFeature.QuoteFieldNames...序列化时将字段内容直接输出,不经过转义,等价于jackson的@JsonRawValue boolean jsonDirect() default false; // 指定序列化时使用的...> mappingTo() default Void.class; // 反序列化时指定java bean builder(必须是@JSONPOJOBuilder注解的),等价于jackson...() default ""; // 反序列化某个接口或抽象或父的子类时指定根据哪个字段的值和子类的typeName相等来决定具体实现,等价于jackson的@JsonTypeInfo.use...() = Id.CUSTOM + @JsonTypeInfo.property() String typeKey() default ""; // 反序列化某个接口或抽象或父的子类时指定可以反序列化的子类类型

5.2K10

用了几年的 Fastjson,最终替换成了 Jackson!

原因有以下几点: fastjson 太过于侧重性能,对于部分高级特性支持不够,而且部分自定义特性完全偏离了 json 和 js 规范导致和其他框架兼容; fastjson 文档缺失较多,部分 Feature...反序列化时,等价于@JsonProperty + @JsonDeserialize + @JsonUnwrapped + @JsonFormat+ @JsonAlias; 序列化时,等价于@JsonProperty...> mappingTo() default Void.class; // 反序列化时指定java bean builder(必须是@JSONPOJOBuilder注解的),等价于jackson...typeName() default ""; // 反序列化某个接口或抽象或父的子类时指定根据哪个字段的值和子类的typeName相等来决定具体实现,等价于jackson的@JsonTypeInfo.use...() = Id.CUSTOM + @JsonTypeInfo.property() String typeKey() default ""; // 反序列化某个接口或抽象或父的子类时指定可以反序列化的子类类型

2.2K30
  • 【Java 基础篇】serialVersionUID 详解

    当一个实现了 Serializable 接口(表示该类可以序列化),编译器会自动生成一个 serialVersionUID 字段,用于表示的版本号。...该字段的主要作用是用于在反序列化时检查的版本是否与序列化时的版本一致,以确保反序列化的对象与序列化时的对象是兼容的。 为什么需要 serialVersionUID?...serialVersionUID 的存在是为了处理序列化和反序列化过程中的版本兼容性问题。当一个序列化后,它的字节表示可能会存储在磁盘上或通过网络传输到不同的 JVM(Java 虚拟机)。...版本检查:在反序列化时,serialVersionUID 用于验证序列化的对象是否与当前的版本兼容。如果版本号匹配,反序列化操作将失败,以避免数据不一致性。...例子总结 当使用 serialVersionUID 进行版本控制时,通常需要考虑以下情况:当的版本发生变化时,如何确保反序列化仍然能够成功。

    54720

    Java并发编程:Java 序列化的工作机制

    02 序列化过程 Java序列化的大致过程为:序列化时将Java对象相关的信息、属性及属性值等等以一定的格式转为字节流,反序列化时则根据字节流表示的信息来构建出Java对象。...反序列化时则通过这些介质读取字节流,然后还原为Java对象。 ? 03 序列化作用 提供一种简单又可扩展的对象保存恢复机制。 对于远程调用,能方便对对象进行编码和解码,就像实现对象直接传输。...除了一些特殊指定的,普通必须实现Serializable或Externalizable接口才能序列化。 05 反序列化的例子 反序列化是序列化的反向操作,即通过字节流来还原Java对象。...每个都拥有这么一个ID,在序列化的时候会一起写入流中。...比如下面的代码,Father的属性不会参与序列化,反序列化时Father对象的属性的值为默认值0。 ? 08 哪些字段会被序列化 在序列化时对象的哪些字段会参与到序列化中呢?

    78040

    C#基础知识回顾--串行化与反串行化

    在串行化时,所有的实例数据都保存到存储介质上,在取消串行化时,对象会被还原,且不能与其原实例区别开来。只需给添加Serializable属性,就可以实现串行化实 的成员。...反串行化是串行化的逆过程,数据从存储介质中读取出来,并赋给的实例变量。串行化能保存现有对象的所有状态, 我想我们以前见过的一些游戏的角色账户中的dat文件应该就是串行化的结果。...: using System.Runtime.Serialization.Formatters.Binary; 我们将一个用户对象进行序列化并存储到一个文件中: private static void...在进行串行化的时候,对象转换成二进制保存到文件中。...如果需要对部分字段序列化部分序列化时,我们可以按照如下设置实现 [Serializable] public class User { public string Name

    99070

    面向对象--序列化与反序列

    实现Serializable接口的建议设置serialVersionUID字段值,如果设置,那么每次运行时,编译器会根据的内部实现,包括名、接口名、方法名和属性等来自动生成serialVersionUID...使用Java原生态序列化需要注意,Java反序列化时候不会调用的无参构造方法,而是调用native方法将成员变量赋值为对应类型的初始值,基于性能以及兼容性的考虑,推荐使用Java序列化。...所以在父、子类存在同名成员变量的情况下,Hessian 序列化时,先序列化子类,然后序列化父,因此反序列化结果会导致子类同名成员变量的值覆盖。...transient 修饰符仅适用于变量,不适用于方法和。在序列化时,如果我们不想序列化特定变量以满足安全约束,那么我们应该将该变量声明为transient。...执行序列化时,JVM会忽略transient变量的原始值并将默认值保存到文件中。因此,transient意味着不要序列化。

    1.4K20

    Android 进阶6:两种序列化方式 Serializable 和 Parcelable

    用来标识当前可以 ObjectOutputStream 序列化,以及 ObjectInputStream 反序列化。...也就是说,一个序列化时,运行时会保存它的版本号,然后在反序列化时检查你要反序列化成的对象版本号是否一致,不一致的话就会报错:·InvalidClassException。...此外,序列化过程中不会保存 static 和 transient 修饰的属性,前者很好理解,因为静态属性是与管理的,不属于对象状态;而后者则是 Java 的关键字,专门用来标识序列化的属性。...这样当我们创建一个声明 UID 属性时,名上就会有黄黄的警告: ?...Parcelable 接口的序列化和反序列化时会被转换为 Parcel 类型的数据 。

    1.5K50

    详细聊聊 Java序列化和反序列化的作用

    1、序列化和反序列化是什么? 如果你看过某些的源码或者公司的项目,有一些是实现 Serializable 接口,同时还要显示指定 serialVersionUID 的值。...在 Java 中实现了 Serializable 接口后, JVM 会在底层帮我们实现序列化和反序列化,如果你实现该接口,你也可以自己自定义一个,就是有点复杂,这里展开。....Student 通过这个例子你就大概知道,反序列化是和和属性有关,就像秘钥和公钥一样,只有正确的serialVersionUID和匹配,才能反序列化。...3、序列化的其他特性 1、static 属性不会被序列化 2、transient 修饰的属性,也不会被序列化 当某个字段声明为transient后,默认序列化机制就会忽略该字段 这里我举个例子: class...在序列化时,因为它不会把序列化,所以反序列化只能拿到默认定义的值。

    1.3K50

    经过多方调研,最终还是决定禁用FastJson

    由于接口简单易用,已经广泛使用在缓存序列化,协议交互,Web输出等各种应用场景中。 FastJson的简单示例 先用一个简单的示例来演示一下FastJson的使用。...是的,正是因为这个库来源于阿里的实践,很多最初的设计与标准有一定的差距。而且已经大量应用,就很难在后期改动。外加还经常出现兼容性升级。...当一个中包含了一个接口(或抽象),在使用FastJson进行序列化的时候,会将子类型抹去,只保留接口(抽象)的类型,使得反序列化时无法拿到原始类型。...因此,FastJson引入了AutoType,在序列化时把原始类型记录下来。...有了autoType功能,FastJson在对JSON字符串进行反序列化时,会读取@type到内容,试图把JSON内容反序列化成对象,并且会调用它的setter方法。

    2.3K20

    java的serializable接口_javacloneable接口

    静态变量序列序列化只能保存对象的非静态成员交量,不能保存任何的成员方法和静态的成员变量,而且序列保存的只是变量的值,对于变量的任何修饰符都不能保存。...这其实比较容易理解,序列保存的是对象的状态,静态变量属于的状态,因此 序列化并不保存静态变量。...transient关键字的作用是:阻止实例中那些用此关键字声明的变量持久化;当对象序列化时(从源文件读取字节序列进行重构),这样的实例变量值不会被持久化和恢复。...在反序列化时,为了构造父对象,只能调用父的无参构造函数作为默认的父对象。因此当我们取父对象的变量值时,它的值是调用父无参构造函数后的值。...在这种情况下,在序列化时根据需要在父无参构造函数中对变量进行初始化,否则的话,父变量值都是默认声明的值,如 int 型的默认是 0,string 型的默认是 null。

    93930

    【深入浅出C#】章节 7: 文件和输入输出操作:序列化和反序列

    这样,对象的数据可以保存在文件、数据库中,或通过网络传输到其他计算机。 反序列化则是将序列化后的数据重新转换为对象的过程,以便在程序中使用。...分布式系统: 不同的应用程序需要共享数据,序列化和反序列化可以使其在不同系统之间传递。 缓存: 对象可以序列化并保存在缓存中,以加快后续访问速度。...当一个标记为 Serializable,它的对象可以通过序列化机制进行保存和传输。...这对于特殊的序列化需求非常有用,比如在序列化时保存对象的一部分数据。...字段处理: 对象的字段和属性都可以在序列化时进行保存。但是,你需要考虑哪些字段需要被序列化,哪些字段不需要,以及如何保护敏感信息。

    80980

    Serializable是什么

    实现这个接口的表明它可以序列化——也就是说,对象的状态可以转化为字节流,从而可以持久化存储到磁盘上,或者通过网络传输。...Serializable接口本身并不包含任何方法,它只是一个标识,告诉Java虚拟机(JVM)这个的对象可以序列化。序列化的主要用途包括:对象持久化:将对象状态保存到磁盘上,以便以后恢复。...例如有一个 Person,实现了Serializable接口,那么这个就可以序列化了。...transient关键字的作用是:阻止实例中那些用此关键字声明的变量持久化;当对象序列化时(从源文件读取字节序列进行重构),这样的实例变量值不会被持久化和恢复。...在反序列化时,为了构造父对象,只能调用父的无参构造函数作为默认的父对象。因此当我们取父对象的变量值时,它的值是调用父无参构造函数后的值。

    8610

    序列化机制深入了解 | Java

    自定义序列化: 在一些特殊的情况下,如果一个中包含某种特殊的信息,如银行账户信息时,这是希望将该实例变量值进行序列化,或者这个的某个变量是不可被序列化的,因此希望对该实例遍历进行递归序列化。...当某个对象进行序列化时,系统会自动把该对象的所有实例变量依次进行序列化,如果这个的实例变量引用到其他的对象,则引用的对象也会被序列化,如果引用的对象的实例变量也引用了其他,在被引用的对象也会被实例化...==在序列化的时候对对象里面的数据进行了加密,然后取出来的时候又进行了解密。这就是对象的自定义序列化== 静态变量序列化: 序列保存的是对象的状态,而不是的状态。...最好在每个要序列化的中加入private static final long serialVersionUID这个变量的值,值自己定义。这样该类修改了,该对象也能序列化....如果不显示的定义该值,该类变量的值将会有jvm进行计算,而修改后的的值往往和没修改的值不同,从而容易造成对象反序列化的时候因为版本问题而导致的无法序列化。

    24620

    java 的序列化和反序列化的问题

    引言 将 Java 对象序列化为二进制文件的 Java 序列化技术是 Java 系列技术中一个较为重要的技术点,在大部分情况下,开发人员只需要了解序列化的需要实现 Serializable 接口...之所以打印 10 的原因在于序列化时,并不保存静态变量,这其实比较容易理解,序列保存的是对象的状态,静态变量属于的状态,因此 序列化并不保存静态变量。...在父没有实现 Serializable 接口时,虚拟机是不会序列化父对象的,而一个 Java 对象的构造必须先有父对象,才有子对象,反序列化也例外。...所以反序列化时,为了构造父对象,只能调用父的无参构造函数作为默认的父对象。因此当我们取父对象的变量值时,它的值是调用父无参构造函数后的值。...Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量序列化到文件中,在被反序列化后,transient 变量的值设为初始值,如 int 型的是 0,对象型的是

    894100

    【SQL】CLR聚合函数什么鬼

    干毛要序列化,我也想知道,我只知道这步之后,聚合的所有字段的值都会清空(准确说是重置为类型默认值),所以如果不在序列化时抓住机会赶紧保存数据的话,将会使之前在Init和Accumulate中做的工作全部泡汤...指定就是0,就是什么数据也保存不了~玩毛。...也就是说,序列化时,最多可以写入8000字节的数据,可以保存4000汉字?...通过上文,知道在Accumulate和Terminate之间,隔了一个序列化与反序列化的环节,并且要知道在序列化后,字段的值已经清空过了,已经不是当初那个字段了(除非在反序列化时你把它们还原了)。...清楚这一点,你就应该知道像这样的看起来天经地义的做法: 在聚合中是极大的错误,除非s在序列化时得到保存并在反序列化时进行还原。

    75220

    低功耗设计方法--电源门控示例(一)

    • SHUTDOWN: SLEEP 启动与休眠中相同的断电序列,但现在处理器和缓存都关闭了它们的外部电源。...这使得能够在偏置变化时对延迟和泄漏功率特性进行实验分析。...设计分区 RTL 设计分区以允许三个主要电源域映射到 RTL 设计中: • VDDSOC 是“始终开启”的电源,为除处理器及其缓存之外的整个芯片供电。...在当前的 SALT 实现中,隔离、保存和恢复以及复位的确认都与它们各自的请求相关联;在实现时,这些功能都非常快,无需延迟排序。 Header开关的电源门控控制使用真正的确认。...一些额外的设计注意事项: •复位后,初始化(上电复位)序列脉冲保存/恢复信号以从辅助保持触发器中清除任何 X。在门级网表上运行功能测试程序或向量时,这可能很有用。

    85010

    序列化与ArrayList 的elementData的修饰关键字transient

    ArrayList在序列化的时候会调用writeObject,反序列化时调用readObject 也就是自定义序列化 为什么要自定义序列化?...从以上对于序列化后的二进制文件的解析,我们可以得出以下几个关键的结论:     1、序列化之后保存的是的信息     2、声明为transient的属性不会被序列化,这就是transient关键字的作用...    3、声明为static的属性不会被序列化,这个问题可以这么理解,序列保存的是对象的状态,但是static修饰的变量是属于的而不是属于变量的,因此序列化的时候不会序列化它 手动指定序列化过程...:       1、当父继承Serializable接口时,所有子类都可以序列化       2、子类实现了Serializable接口,父没有,父中的属性不能序列化(不报错,数据丢失),但是在子类中属性仍能正确序列化...5、反序列化时,如果serialVersionUID修改,则反序列化时会失败

    84720

    Java--序列化对象

    这种字段包括两种: 一种是主观上不想保存的属性, 如动态生成的属性或者考虑到性能上的要求不准备保存的属性; 另一种是由于该属性的类型没有实现序列化而无法保存的属性, 如Thread类型的属性。...虚拟机是否允许反序列化,不仅取决于路径和功能代码是否一致,还取决于是两个序列化 ID 是否一致。 如果指定serialVersionUID,Java自动生成。...静态变量序列化问题 中静态变量是参加序列化的。因为序列保存的是对象的状态,而静态变量属于的状态。...父如果没有实现 Serializable 接口,虚拟机不会序列化父对象。而一个 Java 对象的构造必须先有父对象,才有子对象,反序列化也例外。...所以反序列化时,为了构造父对象,只能调用父的无参构造函数作为默认的父对象。

    72120

    序列化和反序列化的底层实现原理是什么?

    ()方法源输入流中读取字节序列,再把它们反序列化成为一个对象,并将其返回; 2、实现序列化的要求 只有实现了Serializable或Externalizable接口的的对象才能序列化,否则抛出异常....jpeg 相关注意事项 1、序列化时,只对对象的状态进行保存,而不管对象的方法; 2、当一个父实现序列化,子类自动实现序列化,不需要显式实现Serializable接口; 3、当一个对象的实例变量引用其他对象...显式地定义serialVersionUID有两种用途: 在某些场合,希望的不同版本对序列化兼容,因此需要确保的不同版本具有相同的serialVersionUID; 在某些场合,希望的不同版本对序列化兼容...这是能用序列化解决深拷贝的重要原因; 序列化时的所有数据成员应可序列化除了声明为transient或static的成员。将变量声明为transient告诉JVM我们会负责将变元序列化。...后面数据反序列化时,要重建数据成员(因为它是定义的一部分),但不包含任何数据,因为这个数据成员不向流中写入任何数据。记住,对象流序列化static或transient。

    45120
    领券