iOS/swift之path、url、data 、String与Data之间的转换、data和字典之间转换、对象序列化反序列化

**************从path中获取数据************

let path=Bundle.main.path(forResource: "shengshiquxianarea.plist", ofType: nil)
        let proviceDataArr:NSArray = NSArray(contentsOfFile:path!)!

String转成data

 let str: NSString = "ZhuHai XY"
                         let dataValue: Data = str.data(using: String.Encoding(rawValue: String.Encoding.utf8.rawValue), allowLossyConversion: true)! as Data//字符串转data

data转成String

 let dat:String = String(data: dataValue as Data, encoding: String.Encoding.utf8)!//data转字符串

dada转成字典,最后是转成具体的字典类型

            let json = try?  JSONSerialization.jsonObject(with: returnResult.data!, options: JSONSerialization.ReadingOptions.allowFragments)as? [String:String]

字典序列化成data

            let dict=["ss":"s"]
            let dictata = try? JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted)

对象序列化与饭序列化,

如果要将一个对象持久化,需要把这个对象序列化。过去的做法是实现 NSCoding 协议,但实现 NSCoding 协议的代码写起来很繁琐,尤其是当属性非常多的时候。

Swift4 中引入了 Codable 协议,可以大大减轻了我们的工作量。我们只需要让需要序列化的对象符合 Codable 协议即可,不用再写任何其他的代码。

struct LanguageCodable {

    var name: String

    var version: Int

}

Encode操作:可以直接把符合了 Codable 协议的对象 encode 成 JSON 或者 PropertyList。

let swift = Language(name: "Swift", version: 4)

 

//encoded对象

let encodedData = try JSONEncoder().encode(swift)

 

//从encoded对象获取String

let jsonString = String(data: encodedData, encoding: .utf8)

print(jsonString)

Decode操作:

let decodedData = try JSONDecoder().decode(Language.self, from: encodedData)

print(decodedData.name, decodedData.version)

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
存储工程和对象序列化反序列化可以通过C++的文件输入输出流实现。当我们需要将对象写入文件中时,可以使用ofstream类,而当我们需要从文件中读取对象时,可以使用ifstream类。具体的实现步骤如下: 1. 定义需要存储的对象,例如: ``` class Student { public: string name; int age; string gender; int grade; }; ``` 2. 将对象写入文件中,例如: ``` ofstream ofs("student.txt", ios::binary); Student stu; stu.name = "Tom"; stu.age = 18; stu.gender = "male"; stu.grade = 90; ofs.write((char*)&stu, sizeof(stu)); ofs.close(); ``` 这里使用了二进制模式打开文件,所以需要将对象强制转换为字符指针,并且指定写入的字节数为对象的大小。 3. 从文件中读取对象,例如: ``` ifstream ifs("student.txt", ios::binary); Student stu; ifs.read((char*)&stu, sizeof(stu)); ifs.close(); ``` 同样需要使用二进制模式打开文件,并将读取的内容强制转换为字符指针,指定读取的字节数为对象的大小。 4. 缓冲区可以通过定义一个指定大小的字符数组来实现: ``` char buffer[1024]; ``` 当需要从文件中读取或写入大量数据时,可以先将数据读取到缓冲区中,再从缓冲区中读取或写入数据,这样可以提高效率。 5. 大端小端转换可以通过以下代码实现: ``` #include <algorithm> void swapEndian(void* data, int size) { char* p = (char*)data; std::reverse(p, p + size); } ``` 这里使用了STL中的reverse函数,将数据的字节序反转。需要注意的是,不同的硬件架构可能对字节序有不同的要求,所以在进行大端小端转换时需要谨慎处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值