C# MemoryStream和BinaryFormatter

编程访问文件是通过文件流对象进行的,当应用程序需要访问文件时,必须先创建一个文件流对象,此流对象和文件是一一对应关系。
在.NET中,使用抽象基类System.IO.Stream代表流,它提供Read和Write两个方法。由于数据流的有序性,因此流对象还有一个读写指针,为此,Stream类还有一个Seek方法用于移动读写指针。
FileStream对象的数据来自文件,而MemoryStream对象的数据来自内存缓冲区。这两个类都继承自Stream类。

MemoryStream的数据来自内存中的一块连续区域,这块区域称为“缓冲区(Buffer)”。可以把缓冲区看成一个数组,每个数组元素可以存放一个字节的数据。

在创建MemoryStream对象时,可以指定缓冲区的大小,并且可以在需要的时候更改。
//字节数组
byte[] buffer = new byte[600];
//填充字节数组
private void CreateExampleData()
{
for(int i=0; i<600; i )
{
//byte类型的数最大不能超过255,用256取模实现
buffer[i] = (byte)(i%256);
}
}内存流的基本使用方法:
private void OnTestMemory()
{
//创建测试数据
CreateExampleData();

//创建内存流对象,初始分配50字节的缓冲区
MemoryStream mem = new MemoryStream(50);

//向内存流中写入字节数组的所有数据
mem.Write(buffer,0,buffer.GetLength(0));

MessageBox.Show("写入数据后的内存流长度:" mem.Length.ToString());
MessageBox.Show("分配给内存流的缓冲区大小:" mem.Capacity.ToString());

mem.SetLength(550);

MessageBox.Show("调用SetLength方法后的内存流长度:" mem.Length.ToString());

mem.Capacity = 620;//此值不能小于Length属性
MessageBox.Show("调用Capacity方法后缓冲区大小:" mem.Capacity.ToString());

//将读写指针移到距流开头10个字节的位置
mem.Seek(10,SeekOrigin.Begin);
MessageBox.Show(mem.ReadByte().ToString());
mem.Close();
}内存流的Length属性代表了其中存放的数据的真实长度,而Capacity属性则代表了分配给内存流的内存空间大小。
可以使用字节数组创建一个固定大小的MemoryStream,
MemoryStream mem = new MemoryStream(buffer);这时,无法再设置Capacity属性的大小。
还可以创建只读的内存流对象。
MemoryStream mem = new MemoryStream(buffer,false);
FlieStream用于存取文件。
创建文件并写入内容:
//创建一个新文件
FileStream fsForWrite = new FileStream("test.data",FileMode.Create);
try
{
//写入一个字节
fsForWrite.WriteByte(100);
CreateExampleData();
//将字节数组写入文件
fsForWrite.Write(buffer,0,buffer.GetLength(0));
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
//关闭文件
fsForWrite.Close();
}打开文件并读取内容:
private void ReadFromFile()
{
FileStream fsForRead = new FileStream("test.data",FileMode.Open);
try
{
//读入一个字节
MessageBox.Show("文件的第一个字节为:" fsForRead.ReadByte().ToString());
//读写指针移到距开头10个字节处
fsForRead.Seek(10,SeekOrigin.Begin);
byte[] bs = new byte[10];
//从文件中读取10个字节放到数组bs中
fsForRead.Read(bs,0,10);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
fsForRead.Close(); }
}如果一个程序退出了,但它打开的文件没有被关闭,将导致其他程序无法修改或删除此文件。
 

//-----------------------------------------------------------------------------------------------------------------------

BinaryFormatter序列化

序列化简单点来理解就是把内存的东西写到硬盘中,当然也可以写到内存中(这个内容我会在后面写一个例子).而反序列化就是从硬盘中把信息读到内存中.就这么简单,呵呵,现在来看下面的例子吧!

在这篇文章中我将使用BinaryFormatter

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C# BinaryFormatter 是一个用于序列化和反序列化 .NET 对象的类。它可以将对象转换为字节数组,以便在网络上传输或保存到文件中,也可以将字节数组转换回对象。 以下是一个简单的示例,演示如何使用 BinaryFormatter 将对象序列化为字节数组并将其保存到文件中: ``` using System; using System.IO; using System.Runtime.Serialization.Formatters.Binary; [Serializable] class Person { public string Name { get; set; } public int Age { get; set; } } class Program { static void Main(string[] args) { Person person = new Person { Name = "John", Age = 30 }; BinaryFormatter formatter = new BinaryFormatter(); MemoryStream stream = new MemoryStream(); formatter.Serialize(stream, person); byte[] bytes = stream.ToArray(); File.WriteAllBytes("person.dat", bytes); } } ``` 在这个示例中,我们创建了一个名为 Person 的简单类,并使用 BinaryFormatter 将其序列化为字节数组。然后,我们使用 MemoryStream 将字节数组保存到内存中,并使用 File.WriteAllBytes 将其写入文件 "person.dat" 中。 反序列化对象的过程与序列化相反。以下是一个简单的示例,演示如何使用 BinaryFormatter 从文件中读取字节数组并将其反序列化为对象: ``` using System; using System.IO; using System.Runtime.Serialization.Formatters.Binary; [Serializable] class Person { public string Name { get; set; } public int Age { get; set; } } class Program { static void Main(string[] args) { byte[] bytes = File.ReadAllBytes("person.dat"); BinaryFormatter formatter = new BinaryFormatter(); MemoryStream stream = new MemoryStream(bytes); Person person = (Person)formatter.Deserialize(stream); Console.WriteLine("Name: {0}", person.Name); Console.WriteLine("Age: {0}", person.Age); } } ``` 在这个示例中,我们使用 File.ReadAllBytes 从文件 "person.dat" 中读取字节数组。然后,我们使用 MemoryStream 将字节数组加载到内存中,并使用 BinaryFormatter 将其反序列化为 Person 对象。最后,我们输出 Person 对象的属性值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值