`
三月沙
  • 浏览: 619481 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用C#对对象进行序列化操作

    博客分类:
  • C#
阅读更多

 

/**
 * 
 * 该测试程序使用了C#的序列化进行了整个对象的序列化操作
 * 学生记录类StudentRecord 使用了list泛型类进行学生对象的存储,然后把该类
 * 进行序列化。每次需要查找数据时,又对文件中的数据进行反序列化,再进行相关操作
 */

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


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

            Student s1 = new Student();
            s1.id = "20081120029";
            s1.name = "哈桑";
            s1.major = "文学";
            s1.phone = "12345678";
            s1.sex = "男";
            s1.email = "zhyq0826@gmail.com";

            Student s2 = new Student();
            s2.id = "20081120030";
            s2.name = "阿米尔";
            s2.major = "文学";
            s2.phone = "1234567889";
            s2.sex = "男";
            s2.email = "zhyq0826@gmail.com";

            string path = "record.dat";

            StudentRecord sr = new StudentRecord();


            Console.WriteLine("开始添加学生\n{0}", s1.ToString());
            Console.WriteLine("开始添加学生\n{0}", s2.ToString());
            sr.Add(s1, path); //写入学生信息
            sr.Add(s2, path);
            Console.WriteLine("学生添加完毕");

            Console.WriteLine("-------------------------------");

            Console.WriteLine("开始查找学号为20081120029的学生");
            Student s = sr.Search("20081120029", path);
            Console.WriteLine("查找到的该生信息为\n{0}", s.ToString());


            Console.WriteLine("-------------------------------");


            Console.WriteLine("开始更新20081120029的学生信息");
            s.major = "数学";
            s.email = "zhyq0826@qq.com";
            sr.Update(s, path); //更新完毕

            s = sr.Search("20081120029", path);
            Console.WriteLine("更新完毕后20081120029的学生信息为\n{0}", s.ToString());

            Console.WriteLine("-------------------------------");


            Console.WriteLine("删除学生20081120029的信息\n");
            sr.Delete("20081120029", path);
            List<Student> list = sr.GetAll(path);
            Console.WriteLine("删除后的数据为\n");
            foreach (Student sn in list)
            {
                Console.WriteLine("{0}", sn.ToString());
            }

            if (File.Exists(path))  //程序退出之前删除学生信息值,方便测试程序
            {
                File.Delete(path);
            }

            Console.ReadKey();
        }
    }

    [Serializable]  //标志文件可以进行序列化
    class Student {

        public string email { set; get; }
        public string name { set; get; }
        public string id { set; get; }
        public string sex { set; get; }
        public string birth { set; get; }
        public string phone { set; get; }
        public string major { set; get; }

        public override string ToString()
        {
            return "学号:" + this.id + ",\n" + "名字:" + this.name + ",\n" + "性别:" + this.sex + ",\n" + "出生年月:" + this.birth + ",\n" + "专业:" + this.major + ",\n" + "联系电话:" + this.phone + ",\n" + "email:" + this.email + ",\n";
        }

    }

    class StudentRecord
    {
        private IFormatter formatter;
        private Stream stream;
        private List<Student> list;

        public StudentRecord()
        {
            formatter = new BinaryFormatter();
        }

        public List<Student> GetAll(string path)
        {
            OpenFileForRead(path);
            return list;
        }

        public void Add(Student st,string path)
        {
            OpenFileForRead(path);
            if (list == null)
            {
                list = new List<Student>();
                list.Add(st);
                OpenFileForWrite(path);  //打开文件进行写入
                return;
            }else {
                list.Add(st);
                OpenFileForWrite(path);  //打开文件进行写入
                return;
            }
        }

        public void Update(Student st,string path)
        {
            OpenFileForRead(path);
            if (list == null)
            {
                list = new List<Student>();
                list.Add(st);
                OpenFileForWrite(path);  //打开文件进行写入
            }
            else
            {
                for(int i=0;i<list.Count;i++)
                {
                    if (list[i].id.Equals(st.id))
                    {
                        list.RemoveAt(i);  //删除旧对象
                        list.Add(st); //把更新后的对象添加进去
                        break;
                    }
                }
            }
            OpenFileForWrite(path); //打开文件进行写入
        }

        public void Delete(string id,string path)
        {
            OpenFileForRead(path);
            if (list == null)
            {
                Console.WriteLine("文件中没有数据");
                return;
            }
            else
            {
                for (int i = 0; i < list.Count; i++)
                {
                    if (list[i].id.Equals(id)) //找到对象
                    {
                        list.RemoveAt(i);  //移除对象
                        break;
                    }
                }
                OpenFileForWrite(path); //重新序列化
            }
        }

        public Student Search(string id, string path)
        {
            Student s= null;
            OpenFileForRead(path);
            if (list == null || list.Count == 0)
            {
                Console.WriteLine("文件里没有数据");
                return null;
            }else
            {
                foreach (Student st in list)
                {
                    if (st.id.Equals(id)) //匹配id
                    {
                        s = st;    //如果匹配则返回该对象
                        return s;  
                    }
  
                }
            }
            return null;
        }

        private void OpenFileForRead(string path)
        {
            if (File.Exists(path)) //检测该文件是否存在
            {
                stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);  //存在才打开否则不读取
                this.list = (List<Student>)formatter.Deserialize(stream); //打开反序列
                stream.Close();
            }
            else
            {
                this.list = null;
            }
        }

        private void OpenFileForWrite(string path)
        {
            stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None);
            formatter.Serialize(stream, this.list);
            stream.Close();
        }
    }
}
分享到:
评论

相关推荐

    C#对象序列化反序列化保存与读取和对象直接保存与读取

    本主题将深入探讨如何在Windows Forms(WF)环境中,利用C#语言进行对象的直接保存与读取,以及通过对象序列化和反序列化的方式实现对象的保存与恢复。 首先,我们来理解什么是对象的直接保存与读取。在C#中,可以...

    C#对象序列化与反序列化

    ### C#对象序列化与反序列化 #### 1. 对象序列化的介绍 ##### (1).NET支持对象序列化的几种方式 .NET框架提供了多种序列化机制,它们各自有不同的应用场景和特点。 - **二进制序列化**: - **定义**:二进制...

    C#序列化与反序列化(包括复杂xml对象)

    本文将深入探讨C#中的XML序列化和反序列化技术,包括如何将XML文档解析为对象,以及如何将对象转换回XML文档进行存储。我们将详细讲解三种方法,涵盖从XML节点获取键值对(KV值)到处理对象数组和节点标签组合的反...

    C#序列化反序列化实例

    在C#中,我们可以使用相同的序列化类进行反序列化,只需提供已序列化的数据和目标类型即可。 自定义事件在C#中是一种实现发布-订阅模式的方式,允许对象间通信而不直接耦合。事件通常包含一个委托类型和一个或多个...

    c#对象序列化和反序列化,压缩流

    在C#编程中,对象序列化和反序列化是至关重要的技术,它们允许我们将对象的状态转化为可存储或可传输的数据格式,例如XML、JSON或二进制,以便于保存、恢复或者在网络间传递。而“压缩流”则涉及到数据的压缩和解...

    c#对象序列化与反序列化实例

    在C#编程中,对象序列化和反序列化是至关重要的技术,它们允许开发者将复杂的对象状态转换为可存储或可传输的数据格式,如XML...以上就是关于C#对象序列化与反序列化的基本知识,以及如何在实践中应用这些概念的实例。

    C# 序列化反序列化

    在这个特定的场景中,我们看到的是一个利用C#进行序列化和反序列化的实践例子,用于在文本文件(如TXT)与List对象之间交换数据,最后展示在datagridview中。 1. **什么是序列化?** 序列化是将对象的状态转换为...

    c#操作xml和序列化

    本主题将深入探讨如何使用C#进行XML操作和对象序列化。 一、C#操作XML 1. **XML DOM解析**: C#提供了System.Xml命名空间中的XmlDocument类,用于解析XML文档并创建DOM(Document Object Model)树。通过DOM,你...

    C#对象序列化 源代码

    C#对象序列化是.NET开发中必不可少的一个部分,它提供了保存和还原对象状态的能力,简化了数据交换和持久化操作。`BinaryFormatter`和`JsonSerializer`是主要的序列化工具,它们各有优缺点,适用于不同的场景。理解...

    C# 数组与序列化

    3. **二进制序列化**:使用`System.Runtime.Serialization.Formatters.Binary.BinaryFormatter`将对象转换为二进制流,节省空间,适合本地存储,如: ```csharp BinaryFormatter formatter = new BinaryFormatter();...

    C#关于treeview序列化的一个应用程序

    当我们需要保存用户在TreeView中的操作,比如已展开的节点、选中的节点等,就需要对TreeView进行序列化。这通常涉及到遍历所有节点,收集相关信息,并将其保存到XML、JSON或其他数据格式中。 4. **实现方式**: -...

    C#序列化和反序列化案例.rar

    通过学习和分析这个案例,开发者不仅可以了解C#的序列化和反序列化机制,还可以掌握如何在Windows Forms应用程序中使用控件来展示和交互数据。 总之,C#的序列化和反序列化是数据处理的重要部分,而这个案例提供了...

    C#序列化和反序列化

    综上所述,"C#序列化和反序列化"这个主题涵盖了如何在C#程序中有效地管理和操作数据的各个方面。通过深入理解这些概念和实践,开发者可以更好地处理数据的保存和传输,提升应用程序的性能和功能。

    c#序列化c#序列化

    从给定的代码片段和描述来看,我们正在讨论的主题是C#中的序列化技术,具体而言,是如何在C#中使用二进制序列化(BinaryFormatter)和SOAP序列化(SoapFormatter)对对象进行序列化和反序列化。序列化是将对象的状态...

    C#的控件使用:树形图TreeView如何实现序列化和反序列化.rar

    要对`TreeView`控件进行序列化,我们需要遍历树中的每个节点,将节点信息(包括文本、值、子节点等)转换为一个可以保存的格式。以下是一些关键步骤: 1. **创建数据模型**:为`TreeView`的每个节点创建一个对应的...

    c#序列化的例子序列化的例子

    .NET Framework提供了一套完整的序列化框架,包括BinaryFormatter、XmlSerializer、DataContractSerializer、JsonSerializer等,使得开发者可以方便地进行对象的序列化和反序列化操作。 二、序列化的类型 1. **二...

    C#中使用二进制和ProtoBuf分别进行序列化、反序列化、压缩、解压缩对比测试示例源码.zip

    在压缩和解压缩方面,示例可能使用了.NET Framework提供的`System.IO.Compression.GZipStream`或`System.IO.Compression.DeflateStream`类来对序列化后的数据进行压缩和解压缩。这两种方法都是基于GZIP和DEFLATE算法...

    C#序列化学习的源码

    源码可能包含一些性能优化技巧,如使用流(`Stream`)对象,避免不必要的序列化,或者使用预编译的序列化器(`XmlSerializer.GenerateSerializer`)来提高性能。 9. **序列化与安全性** 序列化可能导致安全问题,...

    对象序列化_三套_C#自身_wow项目_自己改写

    本篇主要介绍了三种在C#中实现对象序列化的方法,并以一个名为“wow项目”的具体场景为例进行了说明。 首先,我们来看第一种方法,即使用C#自身的二进制序列化API。在C#中,`System.Runtime.Serialization....

    C#中Font和Color的Xml序列化

    现在,我们可以将这些自定义类作为属性包含在我们的设置类(例如`Settings`)中,然后使用XmlSerializer对整个设置对象进行序列化和反序列化。这样,即使包含Font和Color的设置也可以保存到XML文件并重新加载。 ```...

Global site tag (gtag.js) - Google Analytics