programing

[Serializable]이란 무엇이며 언제 사용해야 합니까?

padding 2023. 5. 13. 09:16
반응형

[Serializable]이란 무엇이며 언제 사용해야 합니까?

나는 몇몇 수업들이 사용하는 것을 발견했습니다.[Serializable]기여하다.

  • 그것은 무엇일까요?
  • 언제 사용해야 합니까?
  • 어떤 종류의 혜택을 받을 수 있습니까?

그것은 무엇일까요?

에서 개체를 생성하는 경우.넷 프레임워크 애플리케이션, 데이터가 메모리에 저장되는 방법에 대해 생각할 필요가 없습니다.왜냐하면.Net Framework가 이 문제를 해결합니다.그러나 개체의 내용을 파일에 저장하거나, 개체를 다른 프로세스로 보내거나, 네트워크를 통해 전송하려면 다른 형식으로 변환해야 하므로 개체가 어떻게 표현되는지 생각해야 합니다.이 변환을 직렬화라고 합니다.

직렬화에 사용

직렬화를 통해 개발자는 객체의 상태를 저장하고 필요에 따라 다시 생성하여 객체의 저장과 데이터 교환을 제공할 수 있습니다.개발자는 직렬화를 통해 웹 서비스를 통해 원격 응용 프로그램으로 개체를 전송하거나, 한 도메인에서 다른 도메인으로 개체를 전달하거나, 방화벽을 통해 XML 문자열로 개체를 전달하거나, 응용 프로그램 간에 보안 또는 사용자별 정보를 유지 관리하는 등의 작업을 수행할 수 있습니다.

유형에 적용하여 이 유형의 인스턴스를 직렬화할 수 있음을 나타냅니다.클래스가 직렬화 프로세스를 제어하는 인터페이스도 구현하는 경우에도 를 적용합니다.

유형이 직렬화 프로세스를 재정의하는 인터페이스를 구현하지 않는 한 으로 표시된 유형의 모든 공용 및 개인 필드는 기본적으로 직렬화됩니다.기본 직렬화 프로세스에서는 비직렬화 특성으로 표시된 필드를 제외합니다.직렬화 가능한 유형의 필드에 특정 환경에 고유한 포인터, 핸들 또는 기타 데이터 구조가 포함되어 있고 다른 환경에서 의미 있게 재구성할 수 없는 경우에는 해당 필드에 NonSerializedAttribute를 적용할 수 있습니다.

자세한 내용은 MSDN을 참조하십시오.

편집 1

어떤 것을 연속 가능한 것으로 표시하지 않는 이유

데이터를 전송하거나 저장할 때 필요한 데이터만 전송하거나 저장해야 합니다.따라서 전송 지연 및 스토리지 문제가 줄어듭니다.따라서 직렬화할 때 불필요한 데이터 덩어리를 제거할 수 있습니다.

원래 질문은 직렬화 가능한 특성에 대한 것이었기 때문에 이 특성은 이진 포맷터 또는 Soap 포맷터를 사용할 때만 적용됩니다.

사용 시기와 실제 용도가 무엇인지, 세부적인 부분에 신경을 쓰지 않는 한 다소 혼란스럽습니다.

XML 또는 JSON 직렬화와는 아무런 관련이 없습니다.

Serializable 특성에는 ISerializable Interface 및 SerializationInfo 클래스가 사용됩니다.또한 이진 포맷터 또는 Soap 포맷터에서만 사용됩니다.

Binary 또는 Soap을 사용하여 클래스를 직렬화하려는 경우가 아니라면 클래스를 [Serializable](직렬화 가능)로 표시하지 마십시오.XML 및 JSON 직렬화 프로그램은 그 존재조차 인식하지 못합니다.

의 몇 가지 실용적인 용도[Serializable]속성:

  • 직렬화를 저장. 또는 '통해 수 . - 이진직여개저장상체를 하십시오. 응용 프로그램의 전체 개체 인스턴스를 파일 또는 네트워크 스트림에 매우 쉽게 '저장'한 다음 역직렬화를 통해 다시 생성할 수 있습니다.BinaryFormatter시스템의 클래스입니다.. 직렬화포맷터.이진법
  • 할 수 를 작성하기 사용하는 입니다.Clipboard.SetData()직렬화할 수 없는 클래스는 클립보드에 배치할 수 없습니다.
  • 입니다. 일반적으로도메인 되는 모든 도메인에서 )MarshalByRefObject할 수 있어야 는 직렬화할 수 있어야 합니다.

이것들은 제가 접하게 된 가장 일반적인 사용 사례들입니다.

직렬화는 개체를 바이트 스트림으로 변환하여 개체를 저장하거나 메모리, 데이터베이스 또는 파일로 전송하는 프로세스입니다.

직렬화 작동 방식

다음 그림은 직렬화의 전반적인 프로세스를 보여줍니다.

여기에 이미지 설명 입력

개체는 데이터를 전송하는 스트림에 직렬화됩니다.스트림에는 버전, 문화 및 어셈블리 이름과 같은 개체 유형에 대한 정보도 있을 수 있습니다.이 스트림에서 개체를 데이터베이스, 파일 또는 메모리에 저장할 수 있습니다.

마이크로소프트 문서의 세부 정보입니다.

다음은 직렬화의 작동 방식에 대한 간단한 예입니다.저는 또한 같은 것에 대해 배우고 있었고 두 개의 링크가 유용하다는 것을 알았습니다.직렬화란 무엇이며 에서 직렬화를 수행할 수 있는 방법입니다.NET.

직렬화를 설명하는 샘플 프로그램

만약 당신이 위의 프로그램을 이해하지 못한다면, 여기에 설명이 있는 매우 간단한 프로그램이 주어집니다.

연속화

직렬화는 객체 또는 객체 집합 그래프를 스트림으로 변환하는 프로세스이며, 이진 직렬화의 경우 바이트 배열입니다.

직렬화 사용

  1. 개체의 상태를 파일, 데이터베이스 등에 저장하고 나중에 사용합니다.
  2. 한 프로세스에서 같은 시스템의 다른 프로세스(App Domain)로 개체를 보내고 다른 시스템에서 실행 중인 프로세스로 유선으로 개체를 보내는 것입니다.
  3. 기본 개체에서 작업하는 동안 원래 개체의 복제본을 백업으로 생성합니다.
  4. 개체 집합을 시스템의 클립보드에 쉽게 복사한 다음 동일한 응용프로그램 또는 다른 응용프로그램에 붙여넣을 수 있습니다.

다음은 개체를 직렬화하는 동안 사용되는 유용한 사용자 지정 특성입니다.

[시리얼라이즈 가능] -> 객체의 시리얼라이즈 가능 [비시리얼라이즈됨] -> 객체의 필드를 시리얼라이즈하고 싶지 않을 때 사용합니다.[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();
        }

    }

직렬화:

파일/네트워크 또는 다른 곳에 개체 상태를 쓰는 중입니다.

역직렬화:

파일/네트워크 또는 다른 곳에서 개체 상태를 읽는 중입니다.

언급URL : https://stackoverflow.com/questions/5877808/what-is-serializable-and-when-should-i-use-it

반응형