如何解决了解保存-我只使用Stream,还是同时使用Formatter和Stream?
据我所知,格式化程序将可序列化的对象转换为字节流,而流(例如FileStream)会将这些字节实际写入文件。示例代码:
public static void SaveData(MySerializableData data)
{
BinaryFormatter formatter = new BinaryFormatter();
FileStream stream = new FileStream(SavePath,FileMode.Create);
formatter.Serialize(stream,data);
stream.Close();
}
但是在其他时候,我也看到了这种类型的代码:
void Save()
{
string data = "Value 1";
StreamWriter writer = new StreamWriter("MySaveFile.txt",true);
writer.Write(data);
}
为什么在第二种情况下,我们放弃了两步保存过程?为什么有时有时只使用StreamWriter,而有时却同时使用格式化程序和流对象?
谢谢!
解决方法
BinaryFormatter
将类序列化为字节数组并将其写入流。当您要使用其数据保存/加载类时,这很有用。 Serializtion存储有关正在存储的类图的元数据。
StreamWriter
是一种具有将字符串写入文件的特定功能的流。
考虑以下示例:
MemoryStream mstr = new MemoryStream();
string datastr = "hello!";
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(mstr,datastr);
mstr.Seek(0,SeekOrigin.Begin);
string resultString = Encoding.ASCII.GetString(mstr.ToArray());
如果检查resultString,您会发现它包含以下内容:
"\0\u0001\0\0\0????\u0001\0\0\0\0\0\0\0\u0006\u0001\0\0\0\u0006hello!\v"
好吧,这不是您想要的文本文件,对吧?如您所见,序列化不是用于存储原始数据,而是用于存储类实例。
现在检查:
MemoryStream mstr = new MemoryStream();
StreamWriter sw = new StreamWriter(mstr);
string datastr = "hello!";
sw.Write(datastr);
mstr.Seek(0,SeekOrigin.Begin);
sw.Close();
string resultString = Encoding.ASCII.GetString(mstr.ToArray());
如果您现在检查resultString,它将包含:
"hello!"
如您所见,这是非常不同的,这就是您在文本文件中所期望的。
您还可以将原始二进制数据与流一起存储:
byte[] data = new byte[]{ 1,2,3,4 };
var fs = File.Create("out.dat"); //this creates a new file and creates a filestream
fs.Write(data,data.Length);
fs.Close();
如果您现在使用二进制编辑器检查文件,则会看到其中包含:
0x01,0x02,0x03,0x04
有许多不同用途的流(例如,我在示例中使用的MemoryStream,将其数据存储到内存中的数组的二进制流)以及将流用于许多用途的大量类,在这种情况下,您混合了使用流进行序列化和数据存储的概念,这是两件事。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。