Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么是[Serializable],什么时候应该使用它?_C#_.net_Serialization - Fatal编程技术网

C# 什么是[Serializable],什么时候应该使用它?

C# 什么是[Serializable],什么时候应该使用它?,c#,.net,serialization,C#,.net,Serialization,我发现有些类使用[Serializable]属性 这是什么 我应该什么时候用 我会得到什么样的好处 这是什么? 在.Net framework应用程序中创建对象时,不需要考虑数据如何存储在内存中。因为.Net框架为您解决了这一问题。但是,如果要将对象的内容存储到文件、将对象发送到另一个进程或通过网络传输,则必须考虑对象的表示方式,因为需要转换为不同的格式。这种转换称为序列化 用于序列化 序列化允许开发人员保存对象的状态并根据需要重新创建它,从而提供对象存储和数据交换。通过序列化,开发人员可以执

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

  • 这是什么
  • 我应该什么时候用
  • 我会得到什么样的好处
这是什么? 在.Net framework应用程序中创建对象时,不需要考虑数据如何存储在内存中。因为.Net框架为您解决了这一问题。但是,如果要将对象的内容存储到文件、将对象发送到另一个进程或通过网络传输,则必须考虑对象的表示方式,因为需要转换为不同的格式。这种转换称为序列化

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

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

默认情况下,由标记的类型中的所有公共和私有字段都将序列化,除非该类型实现了重写序列化过程的接口。默认序列化过程不包括标记为的字段。如果可序列化类型的字段包含特定于特定环境的指针、句柄或其他数据结构,并且无法在其他环境中进行有意义的重构,则可能需要应用于该字段

有关更多详细信息,请参阅

编辑1

有没有理由不将某些内容标记为可序列化的


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

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

  • 使用二进制序列化保存对象状态;您可以非常轻松地将应用程序中的整个对象实例“保存”到文件或网络流中,然后通过反序列化重新创建它们-查看System.Runtime.Serialization.Formatters.Binary中的
    BinaryFormatter
  • 使用
    clipboard.SetData()
    写入对象实例可以存储在剪贴板上的类-不能将不可序列化的类放置在剪贴板上
  • 编写与.NET远程处理兼容的类;通常,在应用程序域之间传递的任何类实例(从
    MarshalByRefObject
    扩展的类实例除外)都必须是可序列化的

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

这里是序列化工作原理的简短示例。我也了解到了这一点,我发现两个链接很有用。

如果您不理解上述程序,将给出一个非常简单的程序并进行解释

序列化是将对象转换为字节流以存储该对象或将其传输到内存、数据库或文件的过程

序列化的工作原理

此图显示序列化的整个过程:

对象被序列化为携带数据的流。流还可能包含有关对象类型的信息,例如其版本、区域性和程序集名称。从该流中,对象可以存储在数据库、文件或内存中


有关详细信息,请参见。

序列化

[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
        }

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

序列化的使用

[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
        }

    }
  • 将对象的状态保存到文件、数据库等中并在以后使用
  • 将对象从一个进程发送到同一台计算机上的另一个进程(应用程序域),并通过网络将其发送到另一台计算机上运行的进程
  • 在处理主对象时创建原始对象的克隆作为备份
  • 一组对象可以很容易地复制到系统的剪贴板上,然后粘贴到同一个或另一个应用程序中
  • 下面是在对象序列化过程中使用的一些有用的自定义属性

    [Serializable]->当我们标记对象的可序列化时使用它 [NonSerialized]->当我们不想序列化对象的字段时使用它。 [onserialization]->当我们想在序列化对象的同时执行某些操作时,可以使用它 [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();
            }
    
        }
    

    因为最初的问题是关于SerializableAttribute的,所以应该注意,此属性仅在使用BinaryFormatter或SoapFormatter时适用

    这有点令人困惑,除非你真的注意细节,比如什么时候使用它以及它的实际用途


    它与XML或JSON序列化无关

    与SerializableAttribute一起使用的是ISerializable接口和SerializationInfo类。它们也仅用于BinaryFormatter或SoapFormatter


    除非您打算使用二进制或Soap序列化类,否则不要麻烦将类标记为[Serializable]。XML和JSON序列化程序甚至不知道它的存在。

    它是什么?
    一个实用的用法解释