前言

BinaryFormatter序列化二进制序列化使用二进制编码来生成精简的序列化,以用于存储或基于套接字的网络流等。

内容

下面通过一个小小的例子来给大家说明什么是BinaryFormatter以及它的原理。

  • 需求:一个贷款的小例子,随着时间或者其他因素的影响,我们的贷款利率也会随之进行相应的调整,在后台没有数据库作为的数据存储辅助的情况下,如果我们修改里面的利率值或者其他可变的值的同时,我们更加希望这个值将被手动更新,下次出现的时候,为更新值。那么通过序列化来实现这个。
  • 原理:

首先开始的时候我们创建一个存放序列化以后数据的二进制文件。然后我们会对要序列化的数据进行绑定。针对页面上的变动进行事件触发初始化。如果再次打开页面,利用构造函数初始化显示的参数,然后我们会判断这个二进制文件是否存在,如果存在就反序列化这个文件的数据,显示到页面,如果不存在就显示本来数据。

Demo

  • 要序列化的文件数据
/*
* 说明:实现序列化封装的类
* 作者:周丽同
* 时间:2016年9月18日10:48:56
*/
namespace LoanClass
{
[Serializable]
public class Loan:System.ComponentModel.INotifyPropertyChanged //向客户端发送某一个属性值已经更改的通知
{
public double LoanAmount { get; set; }
public double InterestRate { get; set; }
public int Term { get; set; } //定义一个属性(可读写)
private string p_Customer;
public string Customer
{
get { return p_Customer; }
set {
p_Customer = value;
PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs("Customer"));
}
} //表示将处理 System.ComponentModel.INotifyPropertyChanged.PropertyChanged 事件的方法,该事件在更改组件上的属性时引发。
[field:NonSerialized]//阻止对成员进行序列化
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; //带参数的构造方法,初始化参数
public Loan(double loanAmout, double interestRate, int term, string customer)
{
this.LoanAmount = loanAmout;
this.InterestRate = interestRate;
this.Term = term;
p_Customer=customer;
}
}
}
  • 显示数据,需要经过界面初始化、窗体关闭序列化界面数据、提示更新数据
/*
* 说明:序列化和反序列化应用
* 作者:周丽同
* 时间:2016年9月18日10:50:23
*/
using LoanClass;
using System.IO;
using System.Xml.Serialization;
using System.Runtime.Serialization.Formatters.Binary; namespace LoanApp
{
public partial class Form1 : Form
{
const string FileName = @"..\..\SavedLoan.bin";//声明一个二进制文件
public Form1()
{
InitializeComponent();
} //①界面初始化
private LoanClass.Loan TestLoan=new LoanClass.Loan(10000.0,0.075,36,"zhoulitong");//实例化一个testloan对象
private void Form1_Load(object sender, EventArgs e)
{
if (File.Exists(FileName))//判断该文件是否存在
{
Stream TestFileStream = File.OpenRead(FileName);//读取序列化到该文件的二进制数据
BinaryFormatter deserializer = new BinaryFormatter();
TestLoan = (LoanClass.Loan)deserializer.Deserialize(TestFileStream);//将存入文件的值反序列化给testloan对象
TestFileStream.Close();//释放文件流
} TestLoan.PropertyChanged += this.CustomerPropertyChanged;
//将序列化结果给文本框赋值
textBox1.Text = TestLoan.LoanAmount.ToString();
textBox2.Text = TestLoan.InterestRate.ToString();
textBox3.Text = TestLoan.Term.ToString();
textBox4.Text = TestLoan.Customer;
} //③提示更新数据
private void CustomerPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
MessageBox.Show(e.PropertyName +" "+ "has been changed.");
} //②窗体关闭序列化界面数据
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//将窗体结果进行强制类型转换
TestLoan.LoanAmount = Convert.ToDouble(textBox1.Text);
TestLoan.InterestRate = Convert.ToDouble(textBox2.Text);
TestLoan.Term = Convert.ToInt32(textBox3.Text);
TestLoan.Customer = textBox4.Text; //创建二进制字节流
Stream TestFilesStream = File.Create(FileName);
BinaryFormatter serializer = new BinaryFormatter();
serializer.Serialize(TestFilesStream, TestLoan);//序列化文件为二进制
TestFilesStream.Close();
}
}
}
  • 二进制文件

  • 运行效果

感谢您的宝贵时间······

Serialization之BinaryFormatter的更多相关文章

  1. In .net 4.8,calculate the time cost of serialization in BinaryFormatter,NewtonSoft.json,and System.Text.Json.JsonSerializer.Serialize

    using ConsoleApp390.Model; using Newtonsoft.Json; using System; using System.Collections.Generic; us ...

  2. Serialization之SOAP序列化

    前言 XML序列化还可用于对象序列化符合SOAP规范的XML流.SOAP是一种简单的基于XML的协议,它使应用程序通过HTTP来交换信息.专门为使用XML来传输过程调用而设计的.如同常规的XML序列化 ...

  3. C#.NET如何不序列化字段、属性

    当我们使用公开属性以及公开字段时,都可以顺利的被序列化, 01.[Serializable] 02.public class MyClass 03.{ 04.    public int ID; 05 ...

  4. C# Serialization performance in System.Runtime.Serialization.Formatters.Binary.BinaryFormatter,Newtonsoft.Json.JsonConvert and System.Text.Json.JsonSerializer.Serialize

    In .net core 3.0 using System;using System.Collections.Generic;using System.Collections;using System ...

  5. 谁能在同一文件序列化多个对象并随机读写(反序列化)?BinaryFormatter、SoapFormatter、XmlSerializer还是BinaryReader

    谁能在同一文件序列化多个对象并随机读写(反序列化)?BinaryFormatter.SoapFormatter.XmlSerializer还是BinaryReader 随机反序列化器 +BIT祝威+悄 ...

  6. 在 WCF 中使用高效的 BinaryFormatter 序列化

    本文将定义一个 WCF 终结点行为扩展,以在 WCF 中使用更高效的 BinaryFormatter 进行二进制序列化,并实现对是否使用传统二进制序列化功能的可配置. 介绍 实现步骤 使用方法 效果 ...

  7. [.net 面向对象程序设计进阶] (9) 序列化(Serialization) (一) 二进制流序列化

    [.net 面向对象程序设计进阶]  (9)  序列化(Serialization) (一) 二进制流序列化 本节导读: 在.NET编程中,经常面向对象处理完以后要转换成另一种格式传输或存储,这种将对 ...

  8. Web Service 通过BinaryFormatter序列化和反序列化泛型List

    1.序列化和反序列化的扩展方法如下: using System; using System.Collections.Generic; using System.Linq; using System.T ...

  9. 序列化- 使用BinaryFormatter进行序列化

    可以使用属性(Attribute)将类的元素标为可序列化的(Serializable)和不可被序列化的(NonSerialized)..NET中有两个类实现了IFormatter借口的类中的Seria ...

随机推荐

  1. Linux驱动 - select函数介绍

    一.select 函数介绍 select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型,原型:          #include & ...

  2. linux指令 apt-grt指令使用

    apt-get 是linux的一条指令,主流的linux版本Debian和ubuntu都使用apt-get来安装软件.那么,需安装的软件都放在哪里呢??? apt-get 利用软件安装源来安装软件,其 ...

  3. uptime命令查看系统启动时间和运行时间、查看linux系统负载

    1.uptime命令输出:16:11:40 up 59 days, 4:21, 2 users, load average: 0.00, 0.01, 0.00 2.查看/proc/uptime文件计算 ...

  4. install 命令

    install命令的作用是安装或升级软件或备份数据,它的使用权限是所有用户.install命令和cp命令类似,都可以将文件/目录拷贝到指定的地点.但是,install允许你控制目标文件的属性.inst ...

  5. MySQL 数据库 练习题

    一.表关系 请创建如下表,并创建相关约束 二.操作表 1.自行创建测试数据 2.查询“生物”课程比“物理”课程成绩高的所有学生的学号: 3.查询平均成绩大于60分的同学的学号和平均成绩: 4.查询所有 ...

  6. [我的CVE][CVE-2017-15708]Apache Synapse Remote Code Execution Vulnerability

    漏洞编号:CNVD-2017-36700 漏洞编号:CVE-2017-15708 漏洞分析:https://www.javasec.cn/index.php/archives/117/ [Apache ...

  7. [我的CVE][CVE-2017-15709]Apache ActiveMQ Information Leak

    问题原因: Apache ActiveMQ默认消息队列61616端口对外,61616端口使用了OpenWire协议,这个端口会暴露服务器相关信息,这些相关信息实际上是debug信息. 会返回应用名称, ...

  8. MySQL启动失败解决办法

    本人大二,进了一家培训机构学了两年,然后跟着他们做项目,其实也是练习,然后过程中遇到好多错误,当时解决了,然后下次遇到又忘了,-_-!  -_-||| 我就想通过写博客来记载一下我遇到的错误和解决的办 ...

  9. DAY8-python异常处理

    一.什么是异常 异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止),在python中,错误触发的异常如下 而错误分两种 #语 ...

  10. orancle数据库 插入数量 值大于 1000 解决方案

    存储过程:当基站ID大于1000的时候,把ID通过存储过程插入表,然后处理 不推荐这么弄,没办法,项目逼到这了,以后尽量避免这样的需求发生! CREATE OR REPLACE PROCEDURE i ...