精华内容
下载资源
问答
  • 概述反射和序列化

    2016-07-07 23:19:00
    1、概述反射和序列化  反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。...
    1、概述反射和序列化   
    反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性    
    序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。
     
    2、什么是SOAP,有哪些应用?
    答:SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用的协议,是一个基于XML的协议。使用SOAP,不用考虑任何特定的传输协议(最常用的还是HTTP协议),可以允许任何类型的对象或代码,在任何平台上,以任何一直语言相互通信。这种相互通信采用的是XML格式的消息。 
     SOAP也被称作XMLP,为两个程序交换信息提供了一种标准的工作机制。在各类机构之间通过电子方式相互协作的情况下完全有必要为此制定相应的标准。   
    SOAP描述了把消息捆绑为XML的工作方式。它还说明了发送消息的发送方、消息的内容和地址以及发送消息的时间。SOAP是Web Service的基本通信协议。SOAP规范还定义了怎样用XML来描述程序数据(Program Data),怎样执行RPC(Remote Procedure Call)。大多数SOAP解决方案都支持RPC-style应用程序。SOAP还支持 Document-style应用程序(SOAP消息只包含XML文本信息)。 最后SOAP规范还定义了HTTP消息是怎样传输SOAP消息的。MSMQ、SMTP、TCP/IP都可以做SOAP的传输协议。   
    SOAP 是一种轻量级协议,用于在分散型、分布式环境中交换结构化信息。 SOAP 利用 XML 技术定义一种可扩展的消息处理框架,它提供了一种可通过多种底层协议进行交换的消息结构。 这种框架的设计思想是要独立于任何一种特定的编程模型和其他特定实现的语义。   
    SOAP 定义了一种方法以便将 XML 消息从 A 点传送到 B 点。 为此,它提供了一种基于 XML 且具有以下特性的消息处理框架: 1) 可扩展, 2) 可通过多种底层网络协议使用, 3) 独立于编程模型。
    展开全文
  • 凡是上了点规模的游戏引擎,都需要面对C++反射和序列化的问题。反射和序列化对游戏引擎非常重要,因为在游戏里,需要处理大量的数据对象,数据驱动的编程模式是非常普遍的。比如对于World Editor,有了反射机制,...

          凡是上了点规模的游戏引擎,都需要面对C++反射和序列化的问题。反射和序列化对游戏引擎非常重要,因为在游戏里,需要处理大量的数据和对象,数据驱动的编程模式是非常普遍的。比如对于World Editor,有了反射机制,就能很方便的建立起对象属性和编辑操作的映射(也可以手动hard code去把对象属性列举出来,但这样只能应付小规模的项目)。      

          先来说说反射,反射需要解决两个问题,一是能根据某种标识符动态生成对象,二是能自动提取对象的Meta Data。Java或C#这一类原生支持反射的语言还能够动态查找或执行对象的成员Method,但个人觉得这个对游戏引擎而言不是很重要。对于第一点,动态生成对象的标识符可以是字符串或者数字ID,说白了就是下面这种形式:

    MyClass* obj = CreateInstance("MyClass");

    具体实现起来没什么难度,基本上就是一个map里保存下ID和构造函数的函数指针,然后使用的时候去map里查找。

         提取对象的Meta Data有一定的难度,并且做法也比较多,目前知道的几种做法包括:

      1. 自己修改原生C++,实现一套元对象系统。典型案例有Qt和UE4,两者的具体做法是开发一个预处理器,根据一些规则去解析cpp代码然后生成新的cpp代码,Qt的QObject和MOC以及UE4的UObject和UHT都是这个思路。这么做的好处就是能够完全按照自己的规则来实现,能满足各种复杂需求(比如UE4的Blueprint),是一种“重量级”的解决方案,很有技术含量。缺点就是复杂度高,难以理解,开发和维护成本较高。
      2. 借助其他语言的反射机制,很多脚本语言就支持反射,比如Python。以游戏界常用的Lua为例,Lua虽然没有反射的概念,但是Lua有强大的table类型,可以借助table来生成对象的反射数据。比如可以定义一个Lua table来表示游戏里的怪物:
        Monster = {
        ["Position"] = {0.0,0.0,0.0},
        ["Rotation"] = {0.0,0.0,0.0},
        ["Scale"] = {1.0,1.0,1.0},
        ["Healthy"] = 100,
        ["Attack"] = 10
        }
        然后使用SWIG去解析table生成对应的C++反射数据。这种方法相比与自己去实现一个预处理器来说要简单得多,而且脚本的语法比较简单,其他不了解C++的人也可以轻松使用,并且反射信息的生成和游戏引擎的其他部分是独立的,降低了模块的耦合性。缺点就是不如修改原生C++那样能满足各种复杂需求。
      3. 完全使用原生C++,用宏,模板技巧抽取对象的反射信息,或者借助Boost之类的库,这样做对外界的依赖是最小的,但灵活性和代码可读性会差一些。

          有了反射机制,就能开发一个通用的系统去自动序列化任何包含反射信息的C++对象,将其存储成相应的格式,并且包含对象的标识符,这样就能根据标识符讲对象反序列化出来。

     

          序列化有一种“重量级”的做法:生成一个完整的对象运行时二进制映像,也就是将对象在运行时的整个内存布局完整地保存下来,然后反序列化的时候就能生成和运行时一模一样的对象,这样做的好处就是能实现真正意义上的保存和再现,所有的数据都是完整的。但是实现起来非常复杂,首先C++对象的内存布局牵扯到诸如虚函数表虚拟继承等问题,不同的编译器有不同的实现,然后对于指针类型还需要靠存储额外的指针修正表来恢复所有的指针数据。目前所知道的只有Havok引擎实现了类似的系统。

     

          《游戏引擎架构》一书中作者介绍了一种“生成器类型”的架构,简单说来就是把游戏对象的描述抽取出来,这部分数据成为Spawner,Spawner是轻量级的数据类型,仅包含数据的表示方式,用于在运行时实例化游戏对象。Spawner包含游戏对象的类型标识符和简单的键值对,比如对于一个GameObject,设计一个对应的GameObjectSpawner:

    struct GameObjectSpawner
    {
      Vector m_Position;
      Vector m_Rotation;
      Vector m_Scale;
      MeshInstance* m_Mesh;
    };

    使用的时候,只需要用Spawner去生成对象即可:

    GameObjectSpawner* pSpawner = LoadFromFile();
    GameObject* obj = SpawnFrom(pSpawner);

    Spawner的类型很简单,可以使用脚本或者原生C++去实现,书中作者推荐的方法是使用脚本语言,这样做的好处是简单、低耦合、鲁棒。Spawner模块无需深入了解引擎对象的细节,保持了很松散的耦合。同时其他不了解C++的人员也可以使用,运行时的对象也不会因为Spawner的错误而崩溃。

     

          序列化还有一个问题就是数据的版本兼容,一种简单保险的做法是给每个数据一个默认值,这样如果读到旧的文件,文件中没有此数据就使用默认值。但有时候情况更为复杂,比如旧版本中的数据中y轴是向上的,新版本中z轴是向上的,这时候就需要根据版本号自行转换数据,很难有完美的解决方案,只能直接hardcode各种版本兼容的代码,虽然不美观,但总归是能运行的。

    展开全文
  • 理解.net反射 泛型 序列化 的精美PPT
  • 对于反射序列化 是比较深入的知识 一般编程中都不需要使用到 尤其是反射 然而对需要用到的人来说 这是一个非常有帮助的功能. 在此我简介一下反射序列化 我没有使用MSDN中的术语或者说是正规的解释 但不会是错误...

    对于反射与序列化 是比较深入的知识 一般编程中都不需要使用到 尤其是反射 然而对需要用到的人来说 这是一个非常有帮助的功能.
    在此我简介一下反射与序列化 我没有使用MSDN中的术语或者说是正规的解释 但不会是错误的 所以 如果你对这两个概念还是模糊的话 建议还是查阅MSDN的解释.

    对于什么时候要使用这两种技术呢?
    需要知道某个对象的信息 结构 类 属性 成员变量...等等之类的时候 反射将可以为你实现 可以理解反射为解析似的 反射能将某个程序集(包括对象 模块等)内的几乎所有信息解析出来 理论上是能够解析出.Net架构程序的任何信息 并且 反射外部.Net程序也是可能的 并不只是单单处理对象 记住 是一个程序集.

    而序列化则是将某个对象改写成某种信息格式 然后存储存于某种介质上的过程 当然 某种信息的格式是要能被恢复回来的 这就是反序列化.

    先看看反射要如何实现吧 是的 我认为是如此 将一个程序集加载先 然后用它所提供类来操作这个被加载的程序集 根据不同的类来得到不同的信息.
    操 作它的类是非常丰富的 所以 几乎能得到你所要的所有信息 所有的类与具体的类的用法都可以在MSDN中查到 反射的知识太多 所以 在这里我将只使用PropertyInfo类的操作来演示 让它来得到你加载程序集的属性信息.当然 你还可以用FieldInfo EventInfo等来取得字段与事件信息 似乎举一反五之类的 你能做到.
     
    假定 你现在要反射某个对象的全部属性(有些敏感的属性或许是不能得到的).你得先得到一个对象 当然这是必须的 呵 如果你想反射外部程序 Assembly类可以帮你实现 也可将外部程序引用到你的程序中来 这样对.Net程序都是一样的.

    我们会使用Type类来取得对象的类型
    Type type = obj.GetType();

    假定obj是你的对象 就这么类型中存储着对象的很多信息 GetProperties方法 将会返回这个类型的公共属性 它返回的是一个PropertyInfo[]类型.GetProperties方法中会有一个筛选参数 可以根据指定的条件筛选数据 参数是BindingFlags枚举类型 最常用的就是 BindingFlags.Instance 实例成员 BindingFlags.Public 公共成员 BindingFlags.NonPublic 非公共成员.

    PropertyInfo[] proInfo = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
    如此 就可以得到此对象类型的所有公共属性了.

    //遍历所有属性
    foreach (PropertyInfo p in proInfo)
    {
          Console.WriteLine(p.GetValue(obj, null));//取此属性的值
    }

    噢 实在太简单了 是吧?呵 也许是 反射不会太复杂 但知识点很多 就如我演示的读取属性 也只是反射属性中的一部分 还有更多的对属性的操作.

    如此 可以简单一点 再说说序列化 为什么要将反射与序列化说在一起呢?那就是 如果需要序列化一个对象的话 最快 最优的方法就是先反射对象 再序列化 当然 如果你只是要序列化对象的某些熟悉的信息的话 就没必要进行反射.

    序列化请不要只是认为转换成某种格式 它还要能被存储 能被反序列化.微软提供了三个(还有吗?)序列化操作的类BinaryFormatter二进制格式,SoapFormatter以SOAP格 式,XmlSerializer生成XML格式 这些类都是可以序列化与反序列化的 其实它们操作都是一样的 而XmlSerializer类的功能似乎最弱 判断一个对象是否可以序列化 可以使用IsSerializable来判断.定义一个对象可以序列化 是要在类前面加入[Serializable]标识的.ISerializable接口 可以自定义控制序列化与反序列化的过程.

    下面将序列化一个MyObject类的实例 使用XmlSerializer类来处理 生成XML文件

    [Serializable]
    public class MyObject
    {
        public int n1;
        public int n2;
        public String str;

        public MyObject()
        {
            n1 = 1;
            n2 = 3;
            str = "sfantasy";
        }
    }


    private void myW()
    {
        MyObject x = new MyObject();
        FileStream f = new FileStream("myFileName.xml", FileMode.Create, FileAccess.Write, FileShare.None);
        XmlSerializer xmls = new XmlSerializer(x.GetType());
        xmls.Serialize(f, x);
        f.Close();
    }

    生成的XML文档就是下面这样的

    <?xml version="1.0"?>
    <MyObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <n1>1</n1>
      <n2>3</n2>
      <str>sfantasy</str>
    </MyObject>


    然后执行反序列化 即可读出上述XML文件中的数据 来改变现有对象的数据

    private void myR()
    {
        MyObject myObject = new MyObject();
        myObject.n1 = 0;
        myObject.str = "X";
        XmlSerializer xmls = new XmlSerializer(myObject.GetType());
        FileStream f = new FileStream("myFileName.xml", FileMode.Open);
        myObject = (MyObject)xmls.Deserialize(f);
        f.Close();
    }

    可以看出 要序列化一个自定义的对象是多么的简单~是的 序列化是非常简单的 至少使用这三个操作类是非常简单的 而我有说过我理解的序列化含意 所以 在我看来 你不使用这三个操作类 任意将对象使用任意的格式写入任意的文件 然后能够再还原读取 我想 因该也可称作为序列化.

    对了 使用这三个类时 要记得包含它们的命名空间.
    using System.Xml.Serialization;//XmlSerializer
    using System.Runtime.Serialization.Formatters.Binary;//BinaryFormatter
    using System.Runtime.Serialization.Formatters.Soap;//SoapFormatter


    以下的代码则是对另外两个序列化操作类的实现

    SoapFormatter formatter = new SoapFormatter();//可替换成BinaryFormatter
    FileStream stream = new FileStream("myFileName.xml", FileMode.Create, FileAccess.Write, FileShare.None);
    formatter.Serialize(stream, array);
    stream.Close();

    我提供的示例中 主要是对使用SoapFormatter类序列化系统类型作出了描述 而实现序列化一个系统对象是比实现自定义对象要复杂一些的.有些时候 我们需要序列化一个控件对象 如textBox 而它的类型TextBox中有此属性(或事件以及其它)信息都多少会有一些不可序列化或不可反序列化的信息(我是指使用微软提供的三个序列化类操作) 而使用其它方式 都是可以序列化对象的所有信息的 比如手动写入XML文件.内置的类型又有的没有加入[Serializable]标识 可以用上面提到的IsSerializable来判断对象是否能序列化 你又不能修改系统类型的定义 所以 这些信息你需要跳不过操作.

    序列化窗体所有控件示例代码



    反射在示例中没有详细的代码 所以 这里引用微软一个比较完整的反射代码 相信聪明的你看了之后...不用再举一反五了.

    // This program lists all the members of the
    // System.IO.BufferedStream class.
    using System;
    using System.IO;
    using System.Reflection;

    class ListMembers {
        public static void Main(String[] args) {
            // Specifies the class.
            Type t = typeof (System.IO.BufferedStream);
            Console.WriteLine ("Listing all the members (public and non public) of the {0} type", t);

            // Lists static fields first.
            FieldInfo [] fi = t.GetFields (BindingFlags.Static |
             BindingFlags.NonPublic | BindingFlags.Public);
            Console.WriteLine ("// Static Fields");
            PrintMembers (fi);

            // Static properties.
            PropertyInfo [] pi = t.GetProperties (BindingFlags.Static |
             BindingFlags.NonPublic | BindingFlags.Public);
            Console.WriteLine ("// Static Properties");
            PrintMembers (pi);

            // Static events.
            EventInfo [] ei = t.GetEvents (BindingFlags.Static |
             BindingFlags.NonPublic | BindingFlags.Public);
            Console.WriteLine ("// Static Events");
            PrintMembers (ei);

            // Static methods.
            MethodInfo [] mi = t.GetMethods (BindingFlags.Static |
             BindingFlags.NonPublic | BindingFlags.Public);
            Console.WriteLine ("// Static Methods");
            PrintMembers (mi);

            // Constructors.
            ConstructorInfo [] ci = t.GetConstructors (BindingFlags.Instance |
             BindingFlags.NonPublic | BindingFlags.Public);
            Console.WriteLine ("// Constructors");
            PrintMembers (ci);

            // Instance fields.
            fi = t.GetFields (BindingFlags.Instance | BindingFlags.NonPublic |
             BindingFlags.Public);
            Console.WriteLine ("// Instance Fields");
            PrintMembers (fi);

            // Instance properites.
            pi = t.GetProperties (BindingFlags.Instance | BindingFlags.NonPublic |
             BindingFlags.Public);
            Console.WriteLine ("// Instance Properties");
            PrintMembers (pi);

            // Instance events.
            ei = t.GetEvents (BindingFlags.Instance | BindingFlags.NonPublic |
             BindingFlags.Public);
            Console.WriteLine ("// Instance Events");
            PrintMembers (ei);

            // Instance methods.
            mi = t.GetMethods (BindingFlags.Instance | BindingFlags.NonPublic  
             | BindingFlags.Public);
            Console.WriteLine ("// Instance Methods");
            PrintMembers (mi);

            Console.WriteLine ("\r\nPress ENTER to exit.");
            Console.Read();
        }

        public static void PrintMembers (MemberInfo [] ms) {
            foreach (MemberInfo m in ms) {
                Console.WriteLine ("{0}{1}", "     ", m);
            }
            Console.WriteLine();
        }
    }

     

    转自: http://www.cnblogs.com/dewing/archive/2009/11/06/1597683.html

    展开全文
  • 概述反射和序列化(转)

    千次阅读 2009-11-09 21:07:00
    对于反射序列化 是比较深入的知识 一般编程中都不需要使用到 尤其是反射 然而对需要用到的人来说 这是一个非常有帮助的功能.在此我简介一下反射序列化 我没有使用MSDN中的术语或者说是正规的解释 但不会是错误的...

     对于反射与序列化 是比较深入的知识 一般编程中都不需要使用到 尤其是反射 然而对需要用到的人来说 这是一个非常有帮助的功能.
    在此我简介一下反射与序列化 我没有使用MSDN中的术语或者说是正规的解释 但不会是错误的 所以 如果你对这两个概念还是模糊的话 建议还是查阅MSDN的解释.

    对于什么时候要使用这两种技术呢?
    需要知道某个对象的信息 结构 类 属性 成员变量...等等之类的时候 反射将可以为你实现 可以理解反射为解析似的 反射能将某个程序集(包括对象 模块等)内的几乎所有信息解析出来 理论上是能够解析出.Net架构程序的任何信息 并且 反射外部.Net程序也是可能的 并不只是单单处理对象 记住 是一个程序集.

    而序列化则是将某个对象改写成某种信息格式 然后存储存于某种介质上的过程 当然 某种信息的格式是要能被恢复回来的 这就是反序列化.

    先看看反射要如何实现吧 是的 我认为是如此 将一个程序集加载先 然后用它所提供类来操作这个被加载的程序集 根据不同的类来得到不同的信息.
    操 作它的类是非常丰富的 所以 几乎能得到你所要的所有信息 所有的类与具体的类的用法都可以在MSDN中查到 反射的知识太多 所以 在这里我将只使用PropertyInfo类的操作来演示 让它来得到你加载程序集的属性信息.当然 你还可以用FieldInfo EventInfo等来取得字段与事件信息 似乎举一反五之类的 你能做到.
     
    假定 你现在要反射某个对象的全部属性(有些敏感的属性或许是不能得到的).你得先得到一个对象 当然这是必须的 呵 如果你想反射外部程序 Assembly类可以帮你实现 也可将外部程序引用到你的程序中来 这样对.Net程序都是一样的.

    我们会使用Type类来取得对象的类型
    Type type = obj.GetType();

    假定obj是你的对象 就这么类型中存储着对象的很多信息 GetProperties方法 将会返回这个类型的公共属性 它返回的是一个PropertyInfo[]类型.GetProperties方法中会有一个筛选参数 可以根据指定的条件筛选数据 参数是BindingFlags枚举类型 最常用的就是 BindingFlags.Instance 实例成员 BindingFlags.Public 公共成员 BindingFlags.NonPublic 非公共成员.

    PropertyInfo[] proInfo = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
    如此 就可以得到此对象类型的所有公共属性了.

    //遍历所有属性
    foreach (PropertyInfo p in proInfo)
    {
          Console.WriteLine(p.GetValue(obj, null));//取此属性的值
    }

    噢 实在太简单了 是吧?呵 也许是 反射不会太复杂 但知识点很多 就如我演示的读取属性 也只是反射属性中的一部分 还有更多的对属性的操作.

    如此 可以简单一点 再说说序列化 为什么要将反射与序列化说在一起呢?那就是 如果需要序列化一个对象的话 最快 最优的方法就是先反射对象 再序列化 当然 如果你只是要序列化对象的某些熟悉的信息的话 就没必要进行反射.

    序列化请不要只是认为转换成某种格式 它还要能被存储 能被反序列化.微软提供了三个(还有吗?)序列化操作的类BinaryFormatter二进制格式,SoapFormatter以SOAP格 式,XmlSerializer生成XML格式 这些类都是可以序列化与反序列化的 其实它们操作都是一样的 而XmlSerializer类的功能似乎最弱 判断一个对象是否可以序列化 可以使用IsSerializable来判断.定义一个对象可以序列化 是要在类前面加入[Serializable]标识的.ISerializable接口 可以自定义控制序列化与反序列化的过程.

    下面将序列化一个MyObject类的实例 使用XmlSerializer类来处理 生成XML文件

    [Serializable]
    public class MyObject
    {
        public int n1;
        public int n2;
        public String str;

        public MyObject()
        {
            n1 = 1;
            n2 = 3;
            str = "sfantasy";
        }
    }


    private void myW()
    {
        MyObject x = new MyObject();
        FileStream f = new FileStream("myFileName.xml", FileMode.Create, FileAccess.Write, FileShare.None);
        XmlSerializer xmls = new XmlSerializer(x.GetType());
        xmls.Serialize(f, x);
        f.Close();
    }

    生成的XML文档就是下面这样的

    <?xml version="1.0"?>
    <MyObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <n1>1</n1>
      <n2>3</n2>
      <str>sfantasy</str>
    </MyObject>


    然后执行反序列化 即可读出上述XML文件中的数据 来改变现有对象的数据

    private void myR()
    {
        MyObject myObject = new MyObject();
        myObject.n1 = 0;
        myObject.str = "X";
        XmlSerializer xmls = new XmlSerializer(myObject.GetType());
        FileStream f = new FileStream("myFileName.xml", FileMode.Open);
        myObject = (MyObject)xmls.Deserialize(f);
        f.Close();
    }

    可以看出 要序列化一个自定义的对象是多么的简单~是的 序列化是非常简单的 至少使用这三个操作类是非常简单的 而我有说过我理解的序列化含意 所以 在我看来 你不使用这三个操作类 任意将对象使用任意的格式写入任意的文件 然后能够再还原读取 我想 因该也可称作为序列化.

    对了 使用这三个类时 要记得包含它们的命名空间.
    using System.Xml.Serialization;//XmlSerializer
    using System.Runtime.Serialization.Formatters.Binary;//BinaryFormatter
    using System.Runtime.Serialization.Formatters.Soap;//SoapFormatter


    以下的代码则是对另外两个序列化操作类的实现

    SoapFormatter formatter = new SoapFormatter();//可替换成BinaryFormatter
    FileStream stream = new FileStream("myFileName.xml", FileMode.Create, FileAccess.Write, FileShare.None);
    formatter.Serialize(stream, array);
    stream.Close();

    我提供的示例中 主要是对使用SoapFormatter类序列化系统类型作出了描述 而实现序列化一个系统对象是比实现自定义对象要复杂一些的.有些时候 我们需要序列化一个控件对象 如textBox 而它的类型TextBox中有此属性(或事件以及其它)信息都多少会有一些不可序列化或不可反序列化的信息(我是指使用微软提供的三个序列化类操作) 而使用其它方式 都是可以序列化对象的所有信息的 比如手动写入XML文件.内置的类型又有的没有加入[Serializable]标识 可以用上面提到的IsSerializable来判断对象是否能序列化 你又不能修改系统类型的定义 所以 这些信息你需要跳不过操作.

    序列化窗体所有控件示例代码



    反射在示例中没有详细的代码 所以 这里引用微软一个比较完整的反射代码 相信聪明的你看了之后...不用再举一反五了.

    // This program lists all the members of the
    // System.IO.BufferedStream class.
    using System;
    using System.IO;
    using System.Reflection;

    class ListMembers {
        public static void Main(String[] args) {
            // Specifies the class.
            Type t = typeof (System.IO.BufferedStream);
            Console.WriteLine ("Listing all the members (public and non public) of the {0} type", t);

            // Lists static fields first.
            FieldInfo [] fi = t.GetFields (BindingFlags.Static |
             BindingFlags.NonPublic | BindingFlags.Public);
            Console.WriteLine ("// Static Fields");
            PrintMembers (fi);

            // Static properties.
            PropertyInfo [] pi = t.GetProperties (BindingFlags.Static |
             BindingFlags.NonPublic | BindingFlags.Public);
            Console.WriteLine ("// Static Properties");
            PrintMembers (pi);

            // Static events.
            EventInfo [] ei = t.GetEvents (BindingFlags.Static |
             BindingFlags.NonPublic | BindingFlags.Public);
            Console.WriteLine ("// Static Events");
            PrintMembers (ei);

            // Static methods.
            MethodInfo [] mi = t.GetMethods (BindingFlags.Static |
             BindingFlags.NonPublic | BindingFlags.Public);
            Console.WriteLine ("// Static Methods");
            PrintMembers (mi);

            // Constructors.
            ConstructorInfo [] ci = t.GetConstructors (BindingFlags.Instance |
             BindingFlags.NonPublic | BindingFlags.Public);
            Console.WriteLine ("// Constructors");
            PrintMembers (ci);

            // Instance fields.
            fi = t.GetFields (BindingFlags.Instance | BindingFlags.NonPublic |
             BindingFlags.Public);
            Console.WriteLine ("// Instance Fields");
            PrintMembers (fi);

            // Instance properites.
            pi = t.GetProperties (BindingFlags.Instance | BindingFlags.NonPublic |
             BindingFlags.Public);
            Console.WriteLine ("// Instance Properties");
            PrintMembers (pi);

            // Instance events.
            ei = t.GetEvents (BindingFlags.Instance | BindingFlags.NonPublic |
             BindingFlags.Public);
            Console.WriteLine ("// Instance Events");
            PrintMembers (ei);

            // Instance methods.
            mi = t.GetMethods (BindingFlags.Instance | BindingFlags.NonPublic  
             | BindingFlags.Public);
            Console.WriteLine ("// Instance Methods");
            PrintMembers (mi);

            Console.WriteLine ("/r/nPress ENTER to exit.");
            Console.Read();
        }

        public static void PrintMembers (MemberInfo [] ms) {
            foreach (MemberInfo m in ms) {
                Console.WriteLine ("{0}{1}", "     ", m);
            }
            Console.WriteLine();
        }
    }

    展开全文
  • 上一篇文章介绍了单例模式的几种写法,但是关于单例模式的问题还没有完全说完,今天我们继续介绍通过反射机制和序列化序列化是如何破坏单例的以及解决方案,阅读本文前需要了解单例模式的几种写法,如果对单例模式...
  • 反射序列化

    千次阅读 2007-05-23 11:51:00
    对于反射序列化 是比较深入的知识 一般编程中都不需要使用到 尤其是反射 然而对需要用到的人来说 这是一个非常有帮助的功能.在此我简介一下反射序列化 我没有使用MSDN中的术语或者说是正规的解释 但不会是错误的...
  • 彻底理解序列化和序列化

    千次阅读 2020-01-16 13:27:54
    目录 摘要 简介 一、定义以及相关概念 数据结构、对象与二进制串 二、序列化协议特性 通用性 强健性/鲁棒性 可调试性/可读性 ...三、序列化和序列化的组件 序列化组件与数据库访问组件...
  • 所谓序列化. 一般有三招方式 2进制, xml , soap.好处就是你可以将一个可以序列化得对象. 序列化成一个字符串(字节流).方便在网络里面传送一个对象.反序列化就是, 将一个上面得过程. 反过来. 将一个序列化后得字符串...
  • Java反射机制对象序列化

    千次阅读 2015-06-26 12:08:13
     JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。  ...
  • 说熟悉是因为几乎每个程序员在工作中都直接或间接的使用过它,说陌生是因为大多数程序员对序列化和序列化的认识仅仅停留在比较一下各种不同实现的序列化的性能上面,而很少有程序员对序列化和序列化的设计实现...
  • (一)序列化的基本概念 在Android开发过程中,因为无法将对象的引用传给Activities或者Fragments,我们需要将这些对象放到一个Intent或者Bundle里面,然后再传递。 序列化,表示将一个对象转换成可存储或可传输...
  • 序列化和序列化

    2015-04-27 13:55:48
    序列化和序列化  摘要  序列化和序列化几乎是工程师们每天都要面对的事情,但是要精确掌握这两个概念并不容易:一方面,它们往往作为框架的一部分出现而湮没在框架之中;另一方面,它们会以其他更...
  • 序列化和序列化漏洞的简单理解

    万次阅读 2017-06-28 09:51:45
    2015年11月6日,FoxGlove Security安全团队的@breenmachine 发布的一篇博客[3]中介绍了如何利用Java反序列漏洞,来攻击最新版的WebLogic、WebSphere、JBoss、Jenkins、OpenNMS这些大名鼎鼎的Java应用,实现远程...
  • 说起java的序列化,我们最初的理解就是形成一个文件,保存到本地,这是最为常用的一点,也算是较为基础的一部分了。 而反射呢,不外乎就是跳过预编译,生成一个对象,代替一个new 的过程。 常用基础的应该就是...
  • 本文介绍了Java序列化的基本概念,序列化和序列化的使用方法,以及实现原理等,比较全面地总结序列化相关知识点,并且使用具体例子来加以佐证。 具体代码在我的GitHub中可以找到 ...
  • 理解Java对象序列化

    2017-05-01 09:59:51
    什么是Java对象序列化 Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长。但在现实应用中,就可能要求在JVM...
  • Java 串行化技术可以使你将一个对象的状态写入一个Byte 流里,并且可以从其它地方把该Byte 流里的数据读出来,重新构造一个相同的对象。这种机制允许你将对象通过网络进行传播,并可以随时把对象...序列化就是一种用
  • > gson(泛型、反射、注解) ... Gson源码分析之Json结构抽象注解使用,泛型,Gson关于反射。数据序列化Parcelable、Serializable。...JsonString)序列化(JsonString--->Object)。 Gson,,...
  • 关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结。此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制。 AD: 关于Java序列化的文章早已...
  • 本节讲解的内容 对象的克隆 对象的遍历 对象的序列化和序列化 内置标准类的使用 traits的使用 类对象的相关函数 PHP反射机制
  • 1、序列化是干什么的?  简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object states,但是Java给你...
  • 序列化和序列化技术

    千次阅读 2015-05-12 17:41:11
    序列化和序列化技术 转载: http://www.infoq.com/cn/articles/serialization-and-deserialization 简介 文章作者服务于美团推荐与个性化组,该组致力于为美团用户提供每天billion级别的高质量...
  • 就在昨天同事聊天聊起了序列化,我们熟知并且使用最方便的就是Serializable。 那么为什么要序列化呢? 有些朋友会说:序列化主要是为了数据持久化。 我们都知道Serializable是一个空接口,不需要我们实现任何的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 41,247
精华内容 16,498
关键字:

反射和序列化的理解