面试题答案
一键面试1. 集成依赖
首先,确保项目中集成了Protocol Buffers库。在Objective - C项目中,可以通过CocoaPods引入,在Podfile
中添加:
pod 'ProtocolBuffers'
然后执行pod install
。
2. 生成Objective - C代码
使用protoc
编译器为.proto
文件生成Objective - C代码。假设.proto
文件名为example.proto
,执行以下命令:
protoc --objc_out=./ --proto_path=./ example.proto
这会在指定目录生成对应的.h
和.m
文件。
3. 关键代码示例 - 序列化
假设.proto
文件中有如下定义:
syntax = "proto3";
message InnerMessage {
string inner_field = 1;
}
message OuterMessage {
string outer_field = 1;
InnerMessage inner = 2;
repeated int32 repeated_field = 3;
}
在Objective - C中进行序列化操作代码如下:
#import "OuterMessage.pbobjc.h"
OuterMessage *outerMsg = [OuterMessage message];
outerMsg.outerField = @"Some outer value";
InnerMessage *innerMsg = [InnerMessage message];
innerMsg.innerField = @"Some inner value";
outerMsg.inner = innerMsg;
[outerMsg addRepeatedFieldValue:@(10) forKey:@"repeatedField"];
[outerMsg addRepeatedFieldValue:@(20) forKey:@"repeatedField"];
NSError *error = nil;
NSData *serializedData = [outerMsg dataWithError:&error];
if (serializedData) {
// 序列化成功,可将serializedData发送或存储
} else {
NSLog(@"Serialization error: %@", error);
}
4. 关键代码示例 - 反序列化
#import "OuterMessage.pbobjc.h"
// 假设已经有了从网络或存储获取的NSData对象serializedData
OuterMessage *deserializedOuterMsg = [OuterMessage parseFromData:serializedData error:&error];
if (deserializedOuterMsg) {
NSLog(@"Outer field: %@", deserializedOuterMsg.outerField);
NSLog(@"Inner field: %@", deserializedOuterMsg.inner.innerField);
NSArray<NSNumber *> *repeatedValues = deserializedOuterMsg.repeatedField;
for (NSNumber *num in repeatedValues) {
NSLog(@"Repeated value: %@", num);
}
} else {
NSLog(@"Deserialization error: %@", error);
}
5. 处理嵌套字段要点
- 创建嵌套消息对象:在设置嵌套字段值时,需要先创建嵌套消息的实例对象,如上述代码中先创建
InnerMessage
实例innerMsg
,再将其赋值给OuterMessage
的inner
字段。 - 确保字段顺序:在
.proto
文件中定义的字段顺序很重要,生成的Objective - C访问器会基于此顺序。
6. 处理重复字段要点
- 使用特定方法操作:对于重复字段,使用
addRepeatedFieldValue:forKey:
方法添加值,如添加repeated_field
的值。在反序列化后,通过属性获取重复字段的值,它会返回一个数组。 - 类型一致性:确保添加到重复字段的值类型与
.proto
文件中定义的类型一致,否则可能导致错误。