You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 11:50:19