使用BinaryWriter保存JSON至.dat文件后读取出现特殊字符问题求助
问题根源与解决方法
1. 开头特殊字符的原因
你用BinaryWriter.Write(string)写入字符串时,这个方法会自动在字符串前写入一个4字节的二进制Int32长度前缀(用来标记字符串的字节数)。而你用StreamReader按文本格式读取时,会把这个二进制前缀解析成乱码字符,这就是开头那两个特殊字符的来源——和正则\s+无关,正则只是不必要的额外操作。
2. 当前代码的核心错误
- 读写方式不匹配:二进制写入的内容必须用二进制方式读取,文本写入的内容用文本方式读取,不能混用。
- 多余的正则处理:JSON的空格(包括换行、空格)在语法里是有特定作用的(比如字符串内的空格、分隔符的空格),用
\s+分割再拼接会破坏JSON的结构,完全没必要这么做。
3. 正确的解决方案
方案一:纯文本读写(推荐,JSON本身是文本格式)
直接用.NET提供的文件静态方法,代码简洁且不易出错:
// 保存JSON到文件 string jsonStr = "你的JSON字符串"; string path = @"E:\tempTest\MyTest.dat"; File.WriteAllText(path, jsonStr, Encoding.UTF8); // 从文件加载JSON string loadedJson = File.ReadAllText(path, Encoding.UTF8);
方案二:二进制读写(兼容你的旧写入逻辑)
如果必须保留BinaryWriter的写入方式,加载时要用BinaryReader来读取,它会自动处理长度前缀:
// 加载代码修改为 string path = @"E:\tempTest\MyTest.dat"; using (FileStream fs = File.OpenRead(path)) using (BinaryReader reader = new BinaryReader(fs)) { string loadedJson = reader.ReadString(); // loadedJson就是正确的JSON字符串 }
4. 关于JSON与.dat文件互转的最佳实践
10年前的方法确实过时了,现在更推荐直接序列化/反序列化对象,而不是手动处理JSON字符串:
- 用.NET内置的
System.Text.Json:
// 序列化对象到文件 var yourObj = new { Name = "Test", Value = 123 }; string path = @"E:\tempTest\MyTest.dat"; await File.WriteAllTextAsync(path, JsonSerializer.Serialize(yourObj)); // 从文件反序列化到对象 var loadedObj = JsonSerializer.Deserialize<YourType>(await File.ReadAllTextAsync(path));
- 或者用第三方库Newtonsoft.Json(更灵活):
File.WriteAllText(path, JsonConvert.SerializeObject(yourObj)); var loadedObj = JsonConvert.DeserializeObject<YourType>(File.ReadAllText(path));
.dat只是文件后缀名,本质就是普通文件,用文本方式存储JSON完全没问题,不需要刻意用二进制方式。
内容的提问来源于stack exchange,提问作者RobBobert
相关产品推荐
相关产品推荐

