我发现一些类使用[Serializable]属性。

是什么? 什么时候使用? 我能得到哪些福利?


当前回答

[Serializable]属性的一些实际用途:

Saving object state using binary serialisation; you can very easily 'save' entire object instances in your application to a file or network stream and then recreate them by deserialising - check out the BinaryFormatter class in System.Runtime.Serialization.Formatters.Binary Writing classes whose object instances can be stored on the clipboard using Clipboard.SetData() - nonserialisable classes cannot be placed on the clipboard. Writing classes which are compatible with .NET Remoting; generally, any class instance you pass between application domains (except those which extend from MarshalByRefObject) must be serialisable.

这些是我遇到的最常见的用例。

其他回答

下面是一个关于序列化如何工作的简短示例。我也在学习同样的东西,我发现两个链接很有用。 什么是序列化以及如何在。net中实现序列化。

一个解释序列化的示例程序

如果你不理解上面的程序,这里给出了一个简单的程序和解释。

[Serializable]属性的一些实际用途:

Saving object state using binary serialisation; you can very easily 'save' entire object instances in your application to a file or network stream and then recreate them by deserialising - check out the BinaryFormatter class in System.Runtime.Serialization.Formatters.Binary Writing classes whose object instances can be stored on the clipboard using Clipboard.SetData() - nonserialisable classes cannot be placed on the clipboard. Writing classes which are compatible with .NET Remoting; generally, any class instance you pass between application domains (except those which extend from MarshalByRefObject) must be serialisable.

这些是我遇到的最常见的用例。

序列化:

对象写入文件/网络或任何地方的状态。

反序列化:

从文件/网络或任何地方读取对象状态。

序列化

序列化是将一个对象或一组对象图转换为流的过程,在二进制序列化的情况下是一个字节数组

序列化的用途

保存一个对象的状态到一个文件,数据库等,并在以后使用它。 将一个对象从一个进程发送到同一机器上的另一个进程(应用程序域),也可以通过有线发送到运行在另一台机器上的进程。 在处理主对象时创建原始对象的克隆作为备份。 一组对象可以很容易地复制到系统的剪贴板,然后粘贴到相同或另一个应用程序

下面是在对象序列化期间使用的一些有用的自定义属性

[Serializable] ->当我们标记一个对象的Serializable时使用 [NonSerialized] ->当我们不想序列化一个对象的字段时使用。 [OnSerializing] ->当我们想在序列化对象时执行一些操作时使用 [OnSerialized] ->当我们想在序列化一个对象到流后执行一些操作时使用。

下面是序列化的示例

[Serializable]
    internal class DemoForSerializable
    {
        internal string Fname = string.Empty;
        internal string Lname = string.Empty;

        internal Stream SerializeToMS(DemoForSerializable demo)
        {
            DemoForSerializable objSer = new DemoForSerializable();
            MemoryStream ms = new MemoryStream();
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(ms, objSer);
            return ms;
        }

        [OnSerializing]
        private void OnSerializing(StreamingContext context) {
            Fname = "sheo";
            Lname = "Dayal";
        }
        [OnSerialized]
        private void OnSerialized(StreamingContext context)
        {
       // Do some work after serialized object
        }

    }

下面是调用代码

class Program
    {
        string fname = string.Empty;
        string Lname = string.Empty; 

       static void Main(string[] args)
        {
            DemoForSerializable demo = new DemoForSerializable();

            Stream ms = demo.SerializeToMS(demo);
            ms.Position = 0;

            DemoForSerializable demo1 = new BinaryFormatter().Deserialize(ms) as DemoForSerializable;

            Console.WriteLine(demo1.Fname);
            Console.WriteLine(demo1.Lname);
            Console.ReadLine();
        }

    }

是什么?

在. net框架应用程序中创建对象时,不需要考虑数据是如何存储在内存中的。因为. net框架会帮你处理这些。但是,如果您想将对象的内容存储到文件中,将对象发送到另一个进程或通过网络传输它,则必须考虑对象是如何表示的,因为您将需要转换为不同的格式。这种转换称为序列化。

序列化的用途

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

将SerializableAttribute应用于类型以指示该类型的实例可以序列化。应用SerializableAttribute,即使类也实现了ISerializable接口来控制序列化过程。

All the public and private fields in a type that are marked by the SerializableAttribute are serialized by default, unless the type implements the ISerializable interface to override the serialization process. The default serialization process excludes fields that are marked with NonSerializedAttribute. If a field of a serializable type contains a pointer, a handle, or some other data structure that is specific to a particular environment, and cannot be meaningfully reconstituted in a different environment, then you might want to apply NonSerializedAttribute to that field.

详情请参阅MSDN。

编辑1

任何不将某些东西标记为可序列化的理由

在传输或保存数据时,只需要发送或保存需要的数据。这样就会减少传输延迟和存储问题。因此,在序列化时可以选择排除不必要的数据块。