zoukankan      html  css  js  c++  java
  • 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
    }
  • 相关阅读:
    Using Resource File on DotNet
    C++/CLI VS CSharp
    JIT VS NGen
    [Tip: disable vc intellisense]VS2008 VC Intelisense issue
    UVa 10891 Game of Sum(经典博弈区间DP)
    UVa 10723 Cyborg Genes(LCS变种)
    UVa 607 Scheduling Lectures(简单DP)
    UVa 10401 Injured Queen Problem(简单DP)
    UVa 10313 Pay the Price(类似数字分解DP)
    UVa 10635 Prince and Princess(LCS N*logN)
  • 原文地址:https://www.cnblogs.com/engine1984/p/1797094.html
Copyright © 2011-2022 走看看