二进制序列化

using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;

namespace WebApplication1.Serialize
{
    public partial class Binary1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }
        //二进制序列化不同于 XMLSerializer 类,后者只序列化公共字段。
   
        protected void Button1_Click(object sender, EventArgs e)
        {
            MyObject obj = new MyObject();
            obj.n1 = 1;
            obj.n2 = 24;
            obj.str = "Some String";
            IFormatter formatter = new BinaryFormatter();
            Stream stream = new FileStream("C:/MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None);
            formatter.Serialize(stream, obj);
            stream.Close();
        }
        [Serializable]
        public class MyObject
        {
            public int n1 = 0;
            public int n2 = 0;
            public String str = null;
        }

        protected void Button2_Click(object sender, EventArgs e)
        {
            IFormatter formatter = new BinaryFormatter();
            Stream stream = new FileStream("C:/MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
            MyObject obj = (MyObject)formatter.Deserialize(stream);
            stream.Close();

            // Here's the proof.

            Response.Write("n1: {0}"+ obj.n1+"<br/>");
            Response.Write("n2: {0}" + obj.n2 + "<br/>");
            Response.Write("str: {0}" + obj.str + "<br/>");
        }
        //上面所用的 BinaryFormatter 非常有效,生成了非常简洁的字节流。
        //通过该格式化程序序列化的所有对象也可以通过该格式化程序进行反序列化,这使该工具对于序列化将在 .NET Framework 上被反序列化的对象而言十分理想。
        //需要特别注意的是,在反序列化一个对象时不调用构造函数。出于性能方面的原因对反序列化施加了该约束。
        //但是,这违反了运行库与对象编写器之间的一些通常约定,开发人员应确保他们在将对象标记为可序列化时了解其后果。
        //如果可移植性是必需的,则转为使用 SoapFormatter。
        //只需用 SoapFormatter 代替上面代码中的 BinaryFormatter,
        //并且如前面一样调用 Serialize 和 Deserialize。此格式化程序为上面使用的示例生成以下输出。
    }

转载于:https://www.cnblogs.com/yidianfeng/archive/2009/01/09/1372372.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C# 中,可以使用 BinaryFormatter 类来进行二进制序列化和反序列化操作。下面是一个简单的示例: ```csharp using System; using System.IO; using System.Runtime.Serialization.Formatters.Binary; [Serializable] public class Person { public string Name { get; set; } public int Age { get; set; } } public class Program { static void Main(string[] args) { // 创建一个 Person 对象 Person person = new Person { Name = "Tom", Age = 18 }; // 创建一个 BinaryFormatter 对象 BinaryFormatter formatter = new BinaryFormatter(); // 将 Person 对象序列化二进制流 MemoryStream stream = new MemoryStream(); formatter.Serialize(stream, person); // 将二进制流反序列化为 Person 对象 stream.Seek(0, SeekOrigin.Begin); Person newPerson = (Person)formatter.Deserialize(stream); // 输出序列化后的 Person 对象的属性值 Console.WriteLine($"Name:{newPerson.Name}, Age:{newPerson.Age}"); } } ``` 在上面的示例中,我们首先创建了一个 Person 类,并将其标记为可序列化(即添加了 `[Serializable]` 属性)。然后,我们在 `Main` 方法中创建了一个 Person 对象,并使用 BinaryFormatter 对象将其序列化为一个 MemoryStream 对象。接着,我们将 MemoryStream 对象的读取位置设置为开头,并使用 BinaryFormatter 对象将其反序列化为一个新的 Person 对象。最后,我们输出新的 Person 对象的属性值。 需要注意的是,BinaryFormatter 类在进行序列化和反序列化时,会将对象的完整类型信息也序列化二进制流中。因此,在进行反序列化时,需要确保反序列化的对象类型与序列化时的对象类型完全一致,否则会抛出异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值