前言

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();
}
}
}
  • 二进制文件

  • 运行效果

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

最新文章

  1. C#事件的理解应用
  2. requests高级用法
  3. [javascript svg fill stroke stroke-width x y rect rx ry 属性讲解] svg fill stroke stroke-width rect 绘制具有圆角矩形属性讲解
  4. cell长按出错
  5. 关于oralce字符集问题(复制别人的,纯属自己学习)
  6. 【bzoj1051】 [HAOI2006]受欢迎的牛 tarjan缩点判出度算点数
  7. Python3基础 print 中使用+号,连接两个字符串
  8. iptables配置服务器端口转发
  9. ios ReactiveViewModel
  10. Python 3 读写文件的简单方法!
  11. Redis的事务功能详解
  12. #1 macos和windows下对多Python环境配置的记录
  13. window.onpopstate
  14. 两个UITableView的级联菜单
  15. HTTP协议工作原理
  16. kettle大数据量读写mysql性能优化
  17. javascript prototype学习
  18. linux下通过命令行上传文件到百度网盘
  19. 蜗牛慢慢爬 LeetCode 8. String to Integer (atoi) [Difficulty: Medium]
  20. android popupwindow位置显示

热门文章

  1. vijos1369:难解的问题
  2. [转载]嵌入式linux下操作GPIO
  3. 什么是VBA,他有什么作用
  4. IIS:template
  5. Oracle 多表查询(2)
  6. 2014.2.23加载大数据时不闪烁的listView
  7. JavaScript语言基础-对象与数组
  8. LAMP 3.4 mysql常用操作-2
  9. 使用mui框架后a标签无法跳转
  10. DAY11-MYSQL之ORM框架SQLAlchemy