c# 二进制流的反序列化
时间: 2023-11-22 14:43:07 浏览: 73
C#中二进制流的反序列化操作可以使用BinaryFormatter类的Deserialize方法。以下是一个示例代码:
```csharp
/// <summary>
/// 将byte[]反序列化为对象
/// 使用BinaryFormatter的Deserialize反序列化
/// </summary>
/// <param name="bytes">需要反序列化的二进制流</param>
/// <returns>反序列化后的对象</returns>
public static object DeserializeObject(byte[] bytes)
{
if (bytes == null)
throw new ArgumentNullException("bytes");
object obj;
try
{
using (var ms = new MemoryStream(bytes))
{
IFormatter iFormatter = new BinaryFormatter();
obj = iFormatter.Deserialize(ms); }
}
catch (Exception er)
{
throw new Exception(er.Message);
}
return obj;
}
```
相关问题
C#二进制流的序列化和反序列化操作
C#中可以使用二进制流进行对象的序列化和反序列化操作。对于序列化操作,可以使用IFormatter的Serialize方法将对象序列化为byte[]。具体的方法如下所示:
```
public static byte[] FormatterObjectBytes(object obj)
{
if(obj == null)
throw new ArgumentNullException("obj");
byte[] buff;
try
{
using(var ms = new MemoryStream())
{
IFormatter iFormatter = new BinaryFormatter();
iFormatter.Serialize(ms, obj);
buff = ms.GetBuffer();
}
}
catch(Exception ex)
{
throw new Exception(ex.Message);
}
return buff;
}
```
而对于反序列化操作,则可以使用IFormatter的Deserialize方法将byte[]反序列化为对象。具体的方法如下所示:
```
public static object FormatterByteObject(byte[] buff)
{
if(buff == null)
throw new ArgumentNullException("buff");
object obj;
try
{
using(var ms = new MemoryStream())
{
IFormatter iFormatter = new BinaryFormatter();
obj = iFormatter.Deserialize(ms);
}
}
catch(Exception ex)
{
throw new Exception(ex.Message);
}
return obj;
}
```
通过使用这两个方法,我们可以在C#中对对象进行二进制流的序列化和反序列化操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [C#二进制流的序列化和反序列化操作](https://blog.csdn.net/weixin_33923762/article/details/92329340)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
C#二进制流序列增加字段
在C#中,处理二进制流序列通常涉及到System.IO.BinaryWriter和System.IO.BinaryReader类。如果你想向已经存在的二进制流中增加新的字段,你需要重新考虑流的结构,因为二进制文件不像文本文件那样容易编辑。不过,你可以采取以下步骤来实现:
1. 读取原始的二进制流到内存中。
2. 根据需要添加的字段,更新内存中的数据结构。
3. 将更新后的数据重新写入到新的二进制流中,或者追加到原文件的末尾。
这里有一个简单的例子,展示了如何向二进制流中添加一个int字段:
```csharp
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
public class Example
{
public static void AddFieldToBinaryStream(string filePath, int additionalField)
{
// 将原始二进制流读取到内存中
BinaryReader originalReader = new BinaryReader(File.OpenRead(filePath));
MemoryStream memoryStream = new MemoryStream();
BinaryWriter newWriter = new BinaryWriter(memoryStream);
// 读取数据到新的内存流中,这里假设有一个整数和一个字符串
int originalInt = originalReader.ReadInt32();
string originalString = originalReader.ReadString();
// 写入原始数据到新的内存流中
newWriter.Write(originalInt);
newWriter.Write(originalString);
// 在这里添加新的字段到流中
newWriter.Write(additionalField);
// 关闭所有流资源
originalReader.Close();
newWriter.Close();
// 将新的二进制流写回到文件中
memoryStream.Seek(0, SeekOrigin.Begin);
BinaryWriter writer = new BinaryWriter(File.OpenWrite(filePath));
memoryStream.CopyTo(writer.BaseStream);
writer.Close();
memoryStream.Close();
}
}
// 调用方法示例
// Example.AddFieldToBinaryStream("path_to_file", 123);
```
注意,这种方法仅适用于追加数据到文件末尾的情况,且不会破坏原有数据的读取逻辑。如果需要修改现有数据结构,通常需要更多的处理,比如重构整个序列化逻辑。
阅读全文