为了申明自定义结构为可序列化!
1.序列化的attribute,是为了利用序列化的技术;
2.准备用于序列化的对象必须设置 [System.Serializable] 标签,该标签指示一个类可以序列化。
 便于在网络中传输和保存

解决方案 »

  1.   

    这个不是是 [Category("XXX")] [Description("XXX")]的么
      

  2.   

    就是可以把对象变成txt或者二进制流 ,方便存储和传输。
      

  3.   


    如果你只是看别人的代码,比如说人家写“1”,你问另一帮局外人“1都有什么作用啊?”这谁知道?!只能给你抄段“官方”的话。你把这行代码注释掉,然后自己测试,看看都出现哪些bug,其实就知道了。
      

  4.   

    最好能举个例子 怎样了我就一定要用这个
    举个栗子,你在qq中发送一段文字加图片混合的信息给某人的时候,qq不会提供多个方法分别接收文字和图片,而是将这段内容信息赋值给一个对象,然后序列化这个对象为 byte[],然后对这个数组编码,加密,压缩,然后传输给另一个客户端。客户端收到加密,压缩,编码过后的字节流,也就是byte[] 后,解密,解压,反序列化得到信息对象,直接填充到ui界面。
      

  5.   

    Serializable不是.net的核心概念先是开发人员有需求,说我需要序列化反序列化啊,这是个常用功能,于是有人(只不过这个个恰好是微软)做了个工具类然后需求又说,我这个类里的字段不想全放序列化里啊,这个要序列化那个属性不要。工具类作者说了,那你得传参数啊,直接放方法参数里太麻烦了,每次都要传一堆,干脆用属性标记出来吧,于是有了NonSerialized一干特性,不想序列化的参数你给我标记出来吧这时这个工具类的作者发现他没法区分了:当他遇到一个类,所有字段都没标记NonSerialized,这个类的意思是所有字段都要序列化呢,还是这个类压根不知道序列化这回事呢?作者只好要求调用方用Serializable把要序列化的类标记出来大概就是这样
      

  6.   

    http://www.cnblogs.com/epjnpe/archive/2007/12/05/984053.html
    博客中的一句话
    程序的Session就会存储到数据库中了,有一点需要注意的是,这样配置以后,存到Session中的对象必须是可序列化的,如果是自定义的类,那么就要加上[Seriablizable]属性。官方的例子是序列化后存在xml中
    http://msdn.microsoft.com/zh-cn/library/system.serializableattribute.aspx我的个人理解是一个对象 需要保存到其他地方(或者要和其他人交流),有时候又要反序列化回来,那么应该有些规则。
    我没有看一个对象序列化后会怎么样~ 你可以按官方的例子 最后看看xml是怎么样的 
      

  7.   

    这种的都叫【特性】,又叫属性类,及Attribute ,但是为了和类属性(Property)区分,所以基本都叫做特性,或者特性标记。
    从字面上理解,大概就能猜到他是做什么的了。官方的说法是:
    “特性提供功能强大的方法,用以将元数据或声明信息与代码(程序集、类型、方法、属性等)相关联。 ”

    “Attribute 类将预定义的系统信息或用户定义的自定义信息与目标元素相关联。 目标元素可以是程序集、类、构造函数、委托、枚举、事件、字段、接口、方法、可移植可执行文件模块、参数、属性、返回值、结构或其他特性。”我们来直观的看一下特性的用途:
    添加一个窗体叫Form1,然后增加如下代码 [DefaultEvent( " FormClosed " )]
    public   partial   class  Form1 : Form{}
    然后新建一个窗口Form2继承自Form1
     public   partial   class  Form2 : Form1{}
    最后切换到Form2的窗体设计器上,双击窗体自动生成代码:
     private   void  Form2_FormClosed( object  sender, FormClosedEventArgs e){}看到了吧,这就是改变控件默认事件的特性注意,这里一直说的是XXX类,没错,他就是一个类。所有特性都以单词“Attribute”结束,但是所有特性都可以省略“Attribute”使用。Serializable原名叫SerializableAttribute。中括号中使用特性其实就是调用它的构造函数,所以有些特性可以加参数。
    http://msdn.microsoft.com/zh-cn/library/z0w1kczw.aspx最后说说你说的[Serializeble],他是给序列化和反序列化用的,标识有这个特性的类才能够被序列化。序列化是一种将一个对象的状态(实例变量)持久化到文件中,反序列化就是从这个格式化的文件中读取对象的状态恢复我们保存的对象。用来比如保存程序的当前状态,下次再启动时恢复到上次的状态。具体你可以搜"C#序列化"
    或者看这里:http://www.cnblogs.com/LiZhiW/p/3622365.html
      

  8.   

    首先要理解序列化和反序列化,概念性的就不说了,自己可以查查;
    例:你开发一个程序,服务器用.NET开发,有一个返回的有员工的方法Emps(),你的客户端可能是用.NET开发的WinFrom、WinWeb、或者手机(Android、IOS、Windows Mobile)、或者Linux等,你如何定义Emps()方法返回的数据格式才能确保任何客户端都能解析并展示数据呢?因为Emps()的调用过程可能是一个List<Emp>对象(如下)
     
        Public string Emps()
        {
            EmpManager emp = new EmpManager();
            List<Emp> empInfos = emp.GetInfos();
            //仅是例子,.NET 没有对应的类或方法
           return Json.Serialized(empInfos);
        },但对于客户端是不认识这个对象的也是无法转输时,因此我们可以将List<Emp>转换为JSON或XML格式,这就是一种序列化,当客户端收到这个string时,又将转换为对象集合时,叫反序列化。
          所以我们给Emp类加[Serializable]特性时,就表示Emp类可以被序列化,只有可以被序列化的类才能可以被反序列化,但使用[Serializable]特性进行序列化,也只有.NET 才能反序列化,当然也可以根据.NET 的序列化算法,用Java编写一个反序列化方法,但这种方法就不合适了,因此跨平台的时候,我们通常用通用的序列化方法如Json或Xml等,也可能用开源跨平台的序列化工具如 Google Protobuf。
          如有不对请大家指正。
      

  9.   

    肯定有不少人抄了“官方”的序列化/反序列化的一堆概念给你。问题是,大部分程序中,你不写这个也照样能序列化/反序列化。而有些程序中,对于在其它大部分程序中好好地序列化的类型,你不写这个还就是在运行时给你崩溃(抛出异常)。而此时这些”抄官方解释“的无法回答了,因为根本找准这个”点“。所以我让你自己测试一下,“把这行代码注释掉,然后自己测试,看看都出现哪些bug”。
      

  10.   

    Serializable 这个字眼查一下字典,谁都会。超一堆msdn上的“序列化/反序列”解释,谁都会。但是回答你这个问题“哪些类要加,加了又怎样,什么时候加”,你看到了,跟官方说法一样,大家都懒得说啊。
      

  11.   


    其实这种“含糊其辞”的话,非常容易让人担忧,非常影响 lz 这样的喜欢了解事情真伪的人的心情。这种话也是官话,更多是被动抄袭而来的,自己不明说。说明白一点,其实真正的意思应该反过来翻译才准确:
    当你把数据放入Session集合(并且使用状态服务器或者SQL Server状态数据机制的时候),因为很多对象(类型)其实不能自动地正确反射、序列化,因此希望程序员有一种办法标记出“哪些不能序列化”,好让程序及时崩溃,造成程序崩溃看起来总比带着错误的数据而执行下去要好。但是,实在是有太多的类型不能序列化了,所以“退而求其次”,你只要给类型做一个标记“哪些能够序列化”,也能让asp.net帮你提前崩溃一下程序。这是不得已而为之的,而且不过是帮助程序员“随随便便地”给类型加了一个标注,其准确性肯定有争议的,因为其实这个属性丝毫不能保证对象真的可以序列化或者不能序列化。
      

  12.   


    其实这种“含糊其辞”的话,非常容易让人担忧,非常影响 lz 这样的喜欢了解事情真伪的人的心情。这种话也是官话,更多是被动抄袭而来的,自己不明说。说明白一点,其实真正的意思应该反过来翻译才准确:
    当你把数据放入Session集合(并且使用状态服务器或者SQL Server状态数据机制的时候),因为很多对象(类型)其实不能自动地正确反射、序列化,因此希望程序员有一种办法标记出“哪些不能序列化”,好让程序及时崩溃,造成程序崩溃看起来总比带着错误的数据而执行下去要好。但是,实在是有太多的类型不能序列化了,所以“退而求其次”,你只要给类型做一个标记“哪些能够序列化”,也能让asp.net帮你提前崩溃一下程序。这是不得已而为之的,而且不过是帮助程序员“随随便便地”给类型加了一个标注,其准确性肯定有争议的,因为其实这个属性丝毫不能保证对象真的可以序列化或者不能序列化。
    学习了
    举一反三一下,看对不对
    比如我定义了一个类,标记它可以序列化
    但是类里又引用了其他自定义类的对象,而这个被引用的类没有标记可以序列化
    这样这个类其实是不能正确被序列化的,是这样吧
      

  13.   

    以前在使用.net时,如WebService、WCF等都使用了序列化技术,最近在编写java RMI服务应用后对序列化的理解更深了,Java
    RMI的含义就是,Remote Method Invoke 远程方法调用。
    序列化技术是远程对象访问技术,不是.NET或Java独有的。
      

  14.   


    其实这种“含糊其辞”的话,非常容易让人担忧,非常影响 lz 这样的喜欢了解事情真伪的人的心情。这种话也是官话,更多是被动抄袭而来的,自己不明说。说明白一点,其实真正的意思应该反过来翻译才准确:
    当你把数据放入Session集合(并且使用状态服务器或者SQL Server状态数据机制的时候),因为很多对象(类型)其实不能自动地正确反射、序列化,因此希望程序员有一种办法标记出“哪些不能序列化”,好让程序及时崩溃,造成程序崩溃看起来总比带着错误的数据而执行下去要好。但是,实在是有太多的类型不能序列化了,所以“退而求其次”,你只要给类型做一个标记“哪些能够序列化”,也能让asp.net帮你提前崩溃一下程序。这是不得已而为之的,而且不过是帮助程序员“随随便便地”给类型加了一个标注,其准确性肯定有争议的,因为其实这个属性丝毫不能保证对象真的可以序列化或者不能序列化。猜测 →  求证
    我说出了我曾经的猜测,又没有说我的猜测是对的~
    不是叫楼主自己去求证了么
      

  15.   

    [Serializable]
    class abc
    {}
    表示abc类可序列化。 [Serializable]
            public class MyDataBase
            {
                public List<SinaLogin.UserInfo> MyUserList = new List<SinaLogin.UserInfo>();
            }        /**/
            /// <summary>
            /// 将一个object对象序列化,返回一个byte[]
            /// </summary>
            /// <param name="obj">能序列化的对象</param>
            /// <returns></returns>
            public static byte[] ObjectToBytes(object obj)
            {
                using (MemoryStream ms = new MemoryStream())
                {
                    IFormatter formatter = new BinaryFormatter();
                    formatter.Serialize(ms, obj);
                    return ms.GetBuffer();
                }
            }        /**/
            /// <summary>
            /// 将一个序列化后的byte[]数组还原
            /// </summary>
            /// <param name="Bytes"></param>
            /// <returns></returns>
            public static object BytesToObject(byte[] Bytes)
            {
                using (MemoryStream ms = new MemoryStream(Bytes))
                {
                    IFormatter formatter = new BinaryFormatter();
                    return formatter.Deserialize(ms);
                }
            }        public static void save(string Path, object SenderFile)
            {
                byte[] tempdata = ObjectToBytes(SenderFile);
                File.WriteAllBytes(Path, tempdata);
            }        public static object inputfile(string Path)
            {
                byte[] tempdata = File.ReadAllBytes(Path);
                return BytesToObject(tempdata);
            }例如MyDataBase类  必须标识可序列化
    不然执行save 这个方法会提示该列不可序列化
    SinaLogin.UserInfo 这个类也得标识可序列化。
      

  16.   


    其实这种“含糊其辞”的话,非常容易让人担忧,非常影响 lz 这样的喜欢了解事情真伪的人的心情。这种话也是官话,更多是被动抄袭而来的,自己不明说。说明白一点,其实真正的意思应该反过来翻译才准确:
    当你把数据放入Session集合(并且使用状态服务器或者SQL Server状态数据机制的时候),因为很多对象(类型)其实不能自动地正确反射、序列化,因此希望程序员有一种办法标记出“哪些不能序列化”,好让程序及时崩溃,造成程序崩溃看起来总比带着错误的数据而执行下去要好。但是,实在是有太多的类型不能序列化了,所以“退而求其次”,你只要给类型做一个标记“哪些能够序列化”,也能让asp.net帮你提前崩溃一下程序。这是不得已而为之的,而且不过是帮助程序员“随随便便地”给类型加了一个标注,其准确性肯定有争议的,因为其实这个属性丝毫不能保证对象真的可以序列化或者不能序列化。
    学习了
    举一反三一下,看对不对
    比如我定义了一个类,标记它可以序列化
    但是类里又引用了其他自定义类的对象,而这个被引用的类没有标记可以序列化
    这样这个类其实是不能正确被序列化的,是这样吧
    这样没意义,定义了可序列化的类,只有同样定义了可序列化的对象是会被序列化的,引用了不可序列化的自定义类,对本身没有影响,这需要程序员自己决定何时,如何序列化自己的内容。
      

  17.   

    这个主要是对数据的序列化,和反序列化。
    比如,有后台数据需要转换成json传到前台,当然数据时对象形式的,就需要在改对象上加上[Serializable],反之,前台到后台一样。再比如,ListView数据储存的是一个集合或对象,那么也需要加上[Serializable],Session一样。把数据存储到磁盘中,而不是直接写成txt文档之类的,也需要这样。目前,我就用到这些,其他的需不需要,我就不知道了。总之,需要把对象存储在ListView,session,json之类的,都需要[Serializable]
      

  18.   

    用于显性表示该类可以序列化,.Net里面不同对象/控件对于序列化的方式会有所不同,有些默认是把所有的对象都用.Net本身的机制去做序列化,那么即使你不标示这个特性它也可以运行正常,但是同时也有写方法它有自己部分的实现机制,需要先知道所解析的对象是否是可序列化的,便通过这个特性去处理,所以需要显性的表示这个特性我觉得你了解下就好了,没有必要为这个特性而有任何困扰,简单的解释就是如果你长得比较漂亮,那么如果穿个中性的衣服的话,可能有些人会认错你的性别,那么就需要你穿个性别特征明显一点的衣服以表示你的性别