• C#2008与.NET 3.5 高级程序设计读书笔记(21) 对象序列化


    1.对象序列化

    术语序列化(serialization)描述了持久化(可能还包括传输)一个对象状态到流(如文件流,内存流)的过程.

    当试图通过.NET远程处理层,XML Web服务或WCF这样的远程处理技术将一个对象复制到远程计算机时,具有对类型序列化的能力很关键.

    虽然使用.NET序列化保存对象非常简单,但幕后的调用过程却非常复杂.例如,当一个对象被持久化到流时,所有的相关数据(基类,包含的对象等)也会被自动序列化.
    2.为序列化配置对象

    只需为每个类加上[Serializable]特性,如果要排除某些域,只需在前面加上[NonSerialized]

    如: 

    [Serializable]
    public class Radio
    {
    public bool hasTweeters;
    public bool hasSubWoofers;
    public double[] stationPresets;

    [NonSerialized]
    public string radioID = "XF-552RR6";
    }

    字段的类型对序列化的影响,如下

    代码
    [Serializable]
    public class Person
    {
    //公共字段
    public bool isAlive = true;
    //私有字段
    private int personAge = 21;
    //公共属性/私有数据
    private string fname = string.Empty;
    public string FristName
    {
    get { return fname; }
    set { fname = value; }
    }
    }

    如果由BinaryFormatter或SoapFormatter处理,isAlive,personAge,fname都保存到了所选的流中,然而,XmlSerializer不会保存personAge的值.如果需要使用XmlSerializer序列化,就需要把字段定为公共的.

    3.选择何种序列化

    当使用BinaryFormatter 类型时,不仅仅是将对象中的字段数据持久化,而且也持久化每个类型的完全限定名称和定义程序集的完整名称(名称,版本,公钥标记,区域),在跨越.NET应用程序边界传递对象时,BinaryFormatter 成为理想的选择.

    如果希望持久化的对象图被任意操作系统(Windows,Mac OS,Unix),任何应用程序框架(.NET,J2EE,COM)或编程语言使用,SoapFormatter,XmlSerializer是理想的选择.

     4.例子:

    代码
    [Serializable]
    public class Car
    {
    public Radio theRadio = new Radio();
    public bool isHatchBack;
    }

    [Serializable, XmlRoot(Namespace
    = "http://www.intertech.com")]
    public class JamesBondCar : Car
    {
    [XmlAttribute]
    public bool canFly;
    [XmlAttribute]
    public bool canSubmerge;

    public JamesBondCar(bool skyWorthy, bool seaWorthy)
    {
    canFly
    = skyWorthy;
    canSubmerge
    = seaWorthy;
    }
    // The XmlSerializer demands a default constructor!
    public JamesBondCar() { }
    }
    [Serializable]
    public class Radio
    {
    public bool hasTweeters;
    public bool hasSubWoofers;
    public double[] stationPresets;

    [NonSerialized]
    public string radioID = "XF-552RR6";
    }
    class Program
    {
    static void Main(string[] args)
    {
    Console.WriteLine(
    "***** Fun with Object Serialization *****\n");

    // Make a JamesBondCar and set state.
    JamesBondCar jbc = new JamesBondCar();
    jbc.canFly
    = true;
    jbc.canSubmerge
    = false;
    jbc.theRadio.stationPresets
    = new double[] { 89.3, 105.1, 97.1 };
    jbc.theRadio.hasTweeters
    = true;

    // Now save / Load the car to a specific file.
    SaveAsBinaryFormat(jbc, "CarData.dat");
    LoadFromBinaryFile(
    "CarData.dat");
    SaveAsSoapFormat(jbc,
    "CarData.soap");
    SaveAsXmlFormat(jbc,
    "CarData.xml");
    SaveListOfCars();
    SaveListOfCarsAsBinary();

    Console.ReadLine();
    }

    #region Save / Load as Binary Format
    static void SaveAsBinaryFormat(object objGraph, string fileName)
    {
    // Save object to a file named CarData.dat in binary.
    BinaryFormatter binFormat = new BinaryFormatter();

    using (Stream fStream = new FileStream(fileName,
    FileMode.Create, FileAccess.Write, FileShare.None))
    {
    binFormat.Serialize(fStream, objGraph);
    }
    Console.WriteLine(
    "=> Saved car in binary format!");
    }

    static void LoadFromBinaryFile(string fileName)
    {
    BinaryFormatter binFormat
    = new BinaryFormatter();

    // Read the JamesBondCar from the binary file.
    using (Stream fStream = File.OpenRead(fileName))
    {
    JamesBondCar carFromDisk
    =
    (JamesBondCar)binFormat.Deserialize(fStream);
    Console.WriteLine(
    "Can this car fly? : {0}", carFromDisk.canFly);
    }
    }
    #endregion

    #region Save as SOAP Format
    // Be sure to import System.Runtime.Serialization.Formatters.Soap
    // and reference System.Runtime.Serialization.Formatters.Soap.dll.
    static void SaveAsSoapFormat(object objGraph, string fileName)
    {
    // Save object to a file named CarData.soap in SOAP format.
    SoapFormatter soapFormat = new SoapFormatter();

    using (Stream fStream = new FileStream(fileName,
    FileMode.Create, FileAccess.Write, FileShare.None))
    {
    soapFormat.Serialize(fStream, objGraph);
    }
    Console.WriteLine(
    "=> Saved car in SOAP format!");
    }
    #endregion

    #region Save as XML Format
    static void SaveAsXmlFormat(object objGraph, string fileName)
    {
    // Save object to a file named CarData.xml in XML format.
    XmlSerializer xmlFormat = new XmlSerializer(typeof(JamesBondCar),
    new Type[] { typeof(Radio), typeof(Car) });

    using (Stream fStream = new FileStream(fileName,
    FileMode.Create, FileAccess.Write, FileShare.None))
    {
    xmlFormat.Serialize(fStream, objGraph);
    }
    Console.WriteLine(
    "=> Saved car in XML format!");
    }
    #endregion

    #region Save collection of cars
    static void SaveListOfCars()
    {
    // Now persist a List<> of JamesBondCars.
    List<JamesBondCar> myCars = new List<JamesBondCar>();
    myCars.Add(
    new JamesBondCar(true, true));
    myCars.Add(
    new JamesBondCar(true, false));
    myCars.Add(
    new JamesBondCar(false, true));
    myCars.Add(
    new JamesBondCar(false, false));

    using (Stream fStream = new FileStream("CarCollection.xml",
    FileMode.Create, FileAccess.Write, FileShare.None))
    {
    XmlSerializer xmlFormat
    = new XmlSerializer(typeof(List<JamesBondCar>),
    new Type[] { typeof(JamesBondCar), typeof(Car), typeof(Radio) });
    xmlFormat.Serialize(fStream, myCars);
    }
    Console.WriteLine(
    "=> Saved list of cars!");
    }

    static void SaveListOfCarsAsBinary()
    {
    // Save ArrayList object (myCars) as binary.
    List<JamesBondCar> myCars = new List<JamesBondCar>();

    BinaryFormatter binFormat
    = new BinaryFormatter();
    using (Stream fStream = new FileStream("AllMyCars.dat",
    FileMode.Create, FileAccess.Write, FileShare.None))
    {
    binFormat.Serialize(fStream, myCars);
    }
    Console.WriteLine(
    "=> Saved list of cars in binary!");
    }
    #endregion
    }
  • 相关阅读:
    映射和分析
    文档操作
    向 Nginx 主进程发送 USR1 信号
    ES集群7.3.0设置快照,存储库进行索引备份和恢复等
    ES7.3.0配置邮件告警
    Elasticsearch 史上最全最常用工具清单
    Grok在线调试网址
    Linux 小知识翻译
    Linux 小知识翻译
    Linux 小知识翻译
  • 原文地址:https://www.cnblogs.com/engine1984/p/1797094.html
Copyright © 2020-2023  润新知