为什么要使用序列化

use*_*076 6 c# asp.net serialization

我已经看过几个带有serializable属性的例子,如下所示:

[Serializable()]
            public class sampleClass
            {
                public int Property1{ get; set; }
                public string Proerty2{ get; set; }

                public sampleClass() { }
                public sampleClass(int pr1, int pr2)
                {
                    pr1 = pr1;
                    Name = pr2.ToString();
                }
            }
Run Code Online (Sandbox Code Playgroud)

我从来没有很好地理解它是如何工作的,但是从msdn:

序列化允许开发人员保存对象的状态并根据需要重新创建它,提供对象的存储以及数据交换.通过序列化,开发人员可以执行诸如通过Web服务将对象发送到远程应用程序,将对象从一个域传递到另一个域,将对象作为XML字符串传递到防火墙,或者维护安全性或特定于用户的操作跨应用程序的信息

但问题是,在我的代码示例中,我认为没有用处.只是一个用于从数据库中检索数据的对象,没什么特别的.何时使用以及何时不使用序列化有什么其他用途.例如,我应该总是使用序列化,因为它更安全吗?是这样慢吗?

更新:谢谢你们所有的好答案

Eri*_* J. 6

只要您想要将数据表示移入或移出进程边界,序列化就非常有用.

将对象保存到磁盘是一个简单的例子,您将在许多教程中看到.

更常见的是,序列化用于向Web服务传输数据或从Web服务传输数据,或者将数据保存到数据库或从数据库传出数据.

  • @ user194076是的,这正是串行器的用途. (4认同)
  • @ user194076:例如,您可以使用此方法实现游戏的保存功能,方法是在某个时刻保存游戏对象的状态,然后在加载游戏时重建它们. (3认同)

Kev*_*ock 5

几个答案已经涵盖了为什么您可能希望一般使用序列化的原因.您似乎也想知道为什么特定的类具有属性,[Serializable]并且您想知道为什么可能已经完成.

使用ASP.NET,默认的会话状态存储InProc允许您将任何对象存储为引用并将其保留在堆上.这是存储会话状态的最佳执行方式,但是,它仅在您使用单个工作线程时才有效,或者如果工作线程要更改(不太可能),则可以自动重建所有会话状态.对于其他状态存储模式(StateServerSQL Server),所有会话状态对象必须是可序列化的,因为ASP.NET引擎将首先使用二进制序列化序列化这些对象,然后再将它们发送到存储介质.

在您的情况下,您可能正在使用InProc.虽然仍然将在会话状态中使用的所有类标记为Serializable并以此方式测试它们的一个原因是您可能需要在将来更改它(例如,使用Web场).如果您没有考虑到这一点设计会话状态类,将来很难进行迁移.

另外,仅仅因为你可以删除Serializable属性并且程序在一个环境中"工作"并不意味着它将在另一个环境中工作.例如,它可能适用于Visual Studio测试Web服务器(它始终使用InProc会话状态模式)实例,甚至在开发IIS实例中,但是,可能生产IIS实例设置为使用不同的存储模式.

这些环境/配置差异不一定限于ASP.NET应用程序.还有其他应用程序引擎可以执行此操作,甚至可以执行独立应用程序(构建此类可配置环境并不困难).

最后,您可能正在使用可能被不同应用程序使用的库.有些人可能需要以可序列化的方式存储状态而其他人可能不需要.

由于这些因素,至少在构建库时,考虑使用标记简单值类或状态管理类通常是一个非常好的主意[Serializable].请记住,这会增加测试这些类的工作量,并且可以序列化的内容有限制(即包含套接字引用或打开文件引用的类可能不适合序列化,因为无法序列化开放的外部资源)所以不要过度使用这个.

你问是否使用[Serializable]会慢一些.不,它不会.此属性对性能没有直接影响.但是,如果将应用程序环境更改为序列化对象,则是,性能将受到影响.序列化和反序列化的行为比仅将对象存储在堆上要慢.[注意,可以编写一些例程来查找Serializable属性,然后选择序列化,但这很少见; 通常它就像ASP.NET一样,由管理员或用户决定是否要更改商店介质.