面试题答案
一键面试序列化与反序列化方案选择
- JSON:
- 适用场景:适用于需要与多种不同语言、不同系统进行交互的场景,因为它的可读性强,易于理解和调试,Web 应用中广泛使用。
- Kotlin 实现示例:
import com.google.gson.Gson
data class User(val name: String, val age: Int)
fun main() {
val user = User("John", 30)
val gson = Gson()
val json = gson.toJson(user)
println("Serialized JSON: $json")
val deserializedUser = gson.fromJson(json, User::class.java)
println("Deserialized User: ${deserializedUser.name}, ${deserializedUser.age}")
}
- **优缺点**:
- **优点**:兼容性好,几乎所有编程语言都有 JSON 处理库;可读性强,便于人工阅读和修改;灵活,支持动态结构。
- **缺点**:相比二进制格式,体积较大;解析和生成的性能相对较低。
2. Protocol Buffers:
- 适用场景:适用于性能要求高、对数据体积敏感,且交互双方都能支持 Protocol Buffers 的场景,常用于内部系统间通信。
- Kotlin 实现示例:
首先,定义 .proto
文件:
syntax = "proto3";
message User {
string name = 1;
int32 age = 2;
}
然后,使用 protoc
工具生成 Kotlin 代码。假设生成的代码在 com.example
包下:
import com.example.User
fun main() {
val user = User.newBuilder()
.setName("John")
.setAge(30)
.build()
val byteArray = user.toByteArray()
println("Serialized bytes: ${byteArray.contentToString()}")
val deserializedUser = User.parseFrom(byteArray)
println("Deserialized User: ${deserializedUser.name}, ${deserializedUser.age}")
}
- **优缺点**:
- **优点**:性能高,序列化后的数据体积小;有严格的 schema 定义,数据结构清晰;生成的代码高效。
- **缺点**:兼容性相对差,需要双方都支持 Protocol Buffers;可读性差,不便于人工直接修改;schema 变动时需要重新生成代码。
3. MessagePack: - 适用场景:在需要高性能且数据格式紧凑的场景下适用,适用于对二进制数据处理有一定要求,且系统之间对该格式有支持的情况。 - Kotlin 实现示例: 添加依赖:
<dependency>
<groupId>org.msgpack</groupId>
<artifactId>msgpack-core</artifactId>
<version>0.8.22</version>
</dependency>
Kotlin 代码:
import org.msgpack.core.MessagePack
import org.msgpack.core.MessagePacker
import org.msgpack.core.MessageUnpacker
import java.io.ByteArrayOutputStream
data class User(val name: String, val age: Int)
fun main() {
val user = User("John", 30)
val bos = ByteArrayOutputStream()
val packer = MessagePack.newDefaultPacker(bos)
packer.packString(user.name)
packer.packInt(user.age)
packer.close()
val byteArray = bos.toByteArray()
println("Serialized bytes: ${byteArray.contentToString()}")
val unpacker = MessagePack.newDefaultUnpacker(byteArray)
val deserializedName = unpacker.unpackString()
val deserializedAge = unpacker.unpackInt()
val deserializedUser = User(deserializedName, deserializedAge)
println("Deserialized User: ${deserializedUser.name}, ${deserializedUser.age}")
unpacker.close()
}
- **优缺点**:
- **优点**:性能较好,数据体积小;支持多种数据类型。
- **缺点**:兼容性不如 JSON,可读性也较差,不同语言实现细节可能有差异。