C# 数据的序列化存取

1,什么是序列化?

  序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。序列化使其他代码可以查看或修改那些不序列化便无法访问的对象实例数据。确切地说,代码执行序列化需要特殊的权限:即指定了 SerializationFormatter 标志的 SecurityPermission。在默认策略下,通过 Internet 下载的代码或 Intranet 代码不会授予该权限;只有本地计算机上的代码才被授予该权限。

2.为什么使用序列化

a. 一个原因是将对象的状态保持在存储媒体中,以便可以在以后重新创建精确的副本。我们经常需要将对象的字段值保存到磁盘 中,并在以后检索此数据。尽管不使用序列化也能完成这项工作,但这种方法通常很繁琐而且容易出错,并且在需要跟踪对象的层次结构时,会变得越来越复杂。可 以想象一下编写包含大量对象的大型业务应用程序的情形,程序员不得不为每一个对象编写代码,以便将字段和属性保存至磁盘以及从磁盘还原这些字段和属性。序列化提供了轻松实现这个目标的快捷方法。

b.另一个原因是通过值将对象从一个应用程序域发送到另一个应用程序域中。例如,序列化可用于在 ASP.NET 中保存会话状态并将对象复制到 Windows 窗体的剪贴板中。远程处理还可以使用序列化通过值将对象从一个应用程序域传递到另一个应用程序域中。

(序列化技术的主要两个目的是:持久化存储按值封送数据保护。)

3怎样进行序列化和反序列化?

a .XML序列化
添加System.Runtime.Serialization.Formatters.Binary命名空间;
b. 二进制序列化
添加System.Xml.Serialization命名空间;
NoSerialized属性被Xmllgnore属性替代;
c.soap序列化
典型应用:web service.

下面看一下二进制序列化:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;

namespace serial1
{
    /// <summary>
    /// Person类的序列化
    /// </summary>
    [Serializable]
    public class Person
    {
        public string Sno { get; set; }
        public string Name { get; set; }
        public string Sex { get; set; }
        public int Age { get; set; }
        public string Other { get; set; }

        //非序列化的属性
        [NonSerialized]
        public string NoSerial;

        /// <summary>
        /// 成员函数
        /// </summary>
        /// <returns></returns>
        public string DisplayInfo()
        {
            return "我的学号是:" + Sno + "\n我的名字是:" + Name + "\n我的性别为:" + Sex + "\n我的年龄:" + Age + "\n非序列化:" + NoSerial+"\n";
        }
    }

    class Program
    {
        static void Main(string[] args)
        {

            //实例化两个对象
            var me = new Person
            {
                Sno = "1215115231",
                Name = "wuzhang",
                Sex = "man",
                Age = 22,
                NoSerial="不被序列化1",
                Other = "\n"

            };
            var he = new Person
            {
                Sno = "1215115250",
                Name = "wanggang",
                Sex = "man",
                Age = 21,
                NoSerial = "不被序列化2",
                Other = "\n"

            };
            List<Person> personInfo = new List<Person>();
            personInfo.Add(me);
            personInfo.Add(he);
            //创建一个格式化程序的实例
            IFormatter formatter = new BinaryFormatter();
            //创建一个文件流
            if (!File.Exists("F:\\TestTxt.txt"))
            {
                //FileStream fs1 = new FileStream("F:\\TestTxt.txt", FileMode.Create, FileAccess.Write);//创建写入文件
                Stream stream = new FileStream("F:\\TestTxt.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
                foreach(Person per in personInfo)
                {
                    formatter.Serialize(stream, per);
                }
                stream.Close();
            }
            else
            {
                Stream stream = new FileStream("F:\\TestTxt.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
                foreach (Person per in personInfo)
                {
                    formatter.Serialize(stream, per);
                }
                stream.Close();

            }

           Stream destream = new FileStream("F:\\TestTxt.txt", FileMode.Open,
           FileAccess.Read, FileShare.Read);
           var stillme = (Person)formatter.Deserialize(destream);
           var stillme1 = (Person)formatter.Deserialize(destream);

           Console.WriteLine(stillme.DisplayInfo());
           Console.WriteLine(stillme1.DisplayInfo());

           destream.Close();

           Console.ReadLine();
        }
    }
}

运行结果:

其它两种方式就不再实验了,搞定!

时间: 2024-08-13 09:32:51

C# 数据的序列化存取的相关文章

Json数据的序列化与反序列化的三种常用方法介绍

以下内容是本作者从官网中看相应的教程后所做的demo,其体现了作者对相关知识点的个人理解..作者才疏学浅,难免会有理解不到位的地方..还请各位读者批判性对待... 本文主要介绍在Json数据的序列化与反序列化的过程中我经常用到的三种工具的基本使用方法,及其他们之间 的比较...希望能够对读者们有一些帮助... 这里介绍到的三种解析与生成Json数据的方法分别是:标准JSON解析与生成方法.使用gson解析与生成JSON数据 .使用fastJsson解析与生成JSON数据. 首先,这些工具都可以到

JSON数据的序列化方法

ajax传参是json数据对象时,最好是将json对象先序列化 var stuAnswerTotal = examModule.touch.getData('examAnswer'); console.log(stuAnswerTotal);//Object对象如下 { 17072={ "id" : 1702, "type":"1",                "val":["",'"&quo

数据成员的存取与布局

已知下面一组数据成员: class Point3d{ public: //… private: float x; static List<Point3d*> *freeList; float y; static const int chunkSize = 250; float z; } 数据成员的存取与布局 收藏 数据成员的布局 已知下面一组数据成员: class Point3d{ public: //… private: float x; static List<Point3d*>

数据的序列化,持久化,归档

数据的序列化,持久化,归档 1.Foundation 2.数据属性列表(NSArray,NSDictionary) 3.sqlite,cocodata 归档后文件的数据会自动加密,不再是明文,局限性在于,只能对一个对象进行归档 /**归档,数据持久化,数据序列化**/ /* NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/text.arc"]; NSArray *arr

js实现对json数据的序列化(兼容ie6以上浏览器)

/** * 增加对JSON数据的序列化方法, * 主要用于IE6.7不支持JSON对象的浏览器 */ var xue = xue || {};xue.json = xue.json || {}; xue.json.stringify = function(obj) {    //如果是IE8+ 浏览器(ff,chrome,safari都支持JSON对象),使用JSON.stringify()来序列化    if (window.JSON) {        return JSON.stringi

UDP畅聊系统数据的序列化与反序列化

comm中实现基本数据的序列化与反序列化 基于jsoncpp库,由c++编写,用于为网络数据提供序列化及反序列化功能 使用的几个类 Json::Value 可表示所有的类型,int,float,string等 Json::Reader 将json字符串解析到Value中,反序列化,使用Parse函数 Json::Writer 将Value转换成json字符串型,序列化 它的两个子类:Json::FastWriter 和Json::StyledWriter 两种不同的显示风格 Makefile  

vue.set的使用和vue数据的序列化

首先简单说一下vue双向数据绑定在实际应用上会有一点异常. 1.比如我想使用一个数组内部数据的改变,直接使用arr[0]='bbbb',这样是不会触发数据绑定的.视图不会变化. 2.这个问题就纯是js的问题了..我们需要把一个json数据的值赋值给另一个,当我们改变另一个数据内部的数据时.第一个也会跟着改变 一.首先对于问题一,官方已经给了很好的解释.怪就怪在我没有仔细看文档吧.记录一下涨个记性. <template> <div class="hello"> &

Python 中数据的序列化和反序列化(json处理)

概念: JSON(JavaScript Object Notation):是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等). 这些

Android剪切板传递数据传递序列化对象数据

一.剪切板的使用介绍 1. 剪切板对象的创建 使用剪切板会用到,ClipboardManager对象,这个对像的创建不可以使用构造方法,主要是由于没有提供public的构造函数(单例模式),需要使用Activity.getSystemService(Context.CLIPBOARD_SERVICE)获取该对象.  2. 对象调用的主要方法介绍 在Android-11(Android 3.0)版本之前,利用剪切板传递数据使用setText()和getText()方法,但是在此版本之后,这两个方法