zoukankan      html  css  js  c++  java
  • .NET中序列化(二)

    导航:

    .NET中序列化(一)

    ----------------------------------------------------------------------------------------------------------------------------

    上节说到序列化和反序列化类中的值成员,我们也知道,类中的成员不当当只是值成员还有引用类型,现在我们就介如何序列化引用类型、不可序列、序列化成SOAP格式的文件

    序列化引用类型

    序列化类默认的情况下是要求他的所有的成员都是要可序列化的(除事件、委托、显式定义不可序列化)

    现在我对之前的例子进行改造,例子如下:

        [Serializable]
    public class MyClass
    {
    public string Name
    {
    get;
    set;
    }
    public int Age
    {
    get;
    set;
    }
    public Work MyWork
    {
    get;
    set;
    }
    }

    [Serializable]
    public class Work
    {
    public string Name
    {
    set;
    get;
    }
    public string Address
    {
    set;
    get;
    }
    }

    其实很简单的,就是把MyClass类中有的类成员都加上为[Serializable]属性即可,.NET会去MyClass中遍历所有的成员,智能的跳过类的循环引用。如果MyClass中的Work类型不加[Serializable]属性,那就是说Work不可序列化,那.NET就会报出错误。

    不可序列化成员

    如果你在MyClass中有个SqlConnection类型成员,大家都知道SqlConnection中管理的是数据库的连接,不好被序列化,所以我们在设计的时候不能把SqlConnection序列化了,我们要在SqlConnection的成员中把它加上 [NonSerialized]属性告诉.NET这个类不要被序列化,当反序列化的时候SqlConnection就为null,例子如下:

        [Serializable]
    public class MyClass
    {
    public string Name
    {
    get;
    set;
    }
    public int Age
    {
    get;
    set;
    }
    [NonSerialized]
    Work myWork;

    public Work MyWork
    {
    get
    {
    return myWork;
    }
    set
    {
    myWork = value;
    }
    }
    }


    public class Work
    {
    public string Name
    {
    set;
    get;
    }
    public string Address
    {
    set;
    get;
    }
    }

    这样Work对像就不会被序列化到文件流中,当被反序列化时就MyWork属性就为null了。

    序列化SOAP文件

    要序列化成SOAP就要先用引用System.Runtime.Serialization.Formatters.Soap命名空间中的SoapFormatter类了。SoapFormatter是一个Soap的格式器

    例子如下:

        [Serializable]
    public class MyClass
    {
    public string Name
    {
    get;
    set;
    }
    public int Age
    {
    get;
    set;
    }
    public Work MyWork
    {
    get;
    set;
    }
    }

    [Serializable]
    public class Work
    {
    public string Name
    {
    set;
    get;
    }
    public string Address
    {
    set;
    get;
    }
    }

    class Program
    {
    static void Main(string[] args)
    {
    MyClass my = new MyClass();
    my.Name = "凤姐";
    my.Age = int.MaxValue;

    Work work = new Work();
    work.Address = "你家隔壁";
    work.Name = "不知道";
    my.MyWork = work;

    //这里new 的是Soap格式的了
    System.Runtime.Serialization.IFormatter formatter = new SoapFormatter();

    //创建一个文件流
    Stream stream = new FileStream(@"c:\MyClass.xml", FileMode.Create, FileAccess.Write);

    using (stream)
    {
    //这里就是进行序列化了
    formatter.Serialize(stream, my);
    }
    }
    }



    这样子就把"凤姐"这个对像序列成SOAP格式,生成到你的C盘里了(你可以郁闷下哇哈哈哈),文件内容如下

    <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
    <a1:MyClass id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/ConsoleApplication1/ConsoleApplication1%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
    <_x003C_Name_x003E_k__BackingField id="ref-3">凤姐</_x003C_Name_x003E_k__BackingField>
    <_x003C_Age_x003E_k__BackingField>2147483647</_x003C_Age_x003E_k__BackingField>
    <_x003C_MyWork_x003E_k__BackingField href="#ref-4"/>
    </a1:MyClass>
    <a1:Work id="ref-4" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/ConsoleApplication1/ConsoleApplication1%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
    <_x003C_Name_x003E_k__BackingField id="ref-5">不知道</_x003C_Name_x003E_k__BackingField>
    <_x003C_Address_x003E_k__BackingField id="ref-6">你家隔壁</_x003C_Address_x003E_k__BackingField>
    </a1:Work>
    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

    SOAP格式的序列化文件就有一定的可读性了,这样就可以更好的跨平台的反序列化对像了。不过从速度上来说,当然还是二进制文件更快,可是二进制文件不好进行跨平台的反序列化,各有各的优点吧。

    这节说完了,下节我们我该讲该如何用泛型格式器序列化对像。


  • 相关阅读:
    AGC007题解
    博弈论学习笔记
    ZROI2019 提高十连测
    男人八题2019
    LOJ 2840「JOISC 2018 Day 4」糖
    CF671D Roads in Yusland
    网络流套路小结
    BZOJ 3729 GTY的游戏
    AGC036C GP 2
    BZOJ 5046 分糖果游戏
  • 原文地址:https://www.cnblogs.com/lmm0591/p/2184062.html
Copyright © 2011-2022 走看看