[직렬화 가능]이란 무엇이며 언제 사용해야합니까?


답변:


368

무엇입니까?

.Net 프레임 워크 응용 프로그램에서 개체를 만들 때 데이터가 메모리에 저장되는 방식에 대해 생각할 필요가 없습니다. .Net Framework가이를 처리하기 때문입니다. 그러나 객체의 내용을 파일로 저장하거나 다른 프로세스로 객체를 보내거나 네트워크를 통해 전송하려면 다른 형식으로 변환해야하므로 객체가 어떻게 표현되는지 고려해야합니다. . 이 변환을 직렬화라고합니다.

직렬화에 사용

직렬화를 통해 개발자는 오브젝트의 상태를 저장하고 필요에 따라 다시 작성하여 오브젝트의 스토리지 및 데이터 교환을 제공 할 수 있습니다. 직렬화를 통해 개발자는 웹 서비스를 통해 원격 애플리케이션으로 오브젝트를 전송하거나 한 도메인에서 다른 도메인으로 오브젝트를 전달하거나 XML 문자열로 방화벽을 통해 오브젝트를 전달하거나 보안 또는 사용자 별 유지 보수와 같은 조치를 수행 할 수 있습니다. 응용 프로그램 간 정보.

SerializableAttribute이 유형의 인스턴스가 직렬화 될 수 있음을 나타 내기 위해 유형에 적용하십시오 . SerializableAttribute클래스 ISerializable가 직렬화 프로세스를 제어 하기 위해 인터페이스를 구현하는 경우에도 적용하십시오 .

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

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

편집 1

무언가를 직렬화 가능으로 표시하지 않는 이유

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


1
@dwbartz 귀하의 질문에 대한 답변이 여기에 링크
jayasurya_j

2
좋은 설명, MSDN =)의 특성에 이것을 추가하는 것이 좋을 것입니다.
Martea

@jayasurya_j 너무나도 받아 들여진 대답은 개인 부품
Alexander

1
좋은 설명
Zakir HC

42

[Serializable]속성에 대한 몇 가지 실용적인 용도 :

  • 이진 직렬화를 사용하여 객체 상태 저장; 응용 프로그램의 전체 객체 인스턴스를 파일 또는 네트워크 스트림에 '저장'한 다음 역 직렬화하여 다시 만들 수 있습니다.BinaryFormatter . System.Runtime.Serialization.Formatters.Binary 클래스를
  • 다음을 사용하여 객체 인스턴스를 클립 보드에 저장할 수있는 클래스 작성 Clipboard.SetData()직렬화 할 수없는 클래스를 배치 할 수 없습니다.
  • .NET Remoting과 호환되는 클래스 작성; 일반적으로 응용 프로그램 도메인간에 전달되는 클래스 인스턴스 (에서 확장되는 클래스 제외 MarshalByRefObject)는 직렬화 가능해야합니다.

이것들은 내가 만난 가장 일반적인 사용 사례입니다.


41

원래 질문은 SerializableAttribute에 관한 것이 었으므로이 특성은 BinaryFormatter 또는 SoapFormatter를 사용할 때만 적용됩니다.

세부 사항, 사용 시점 및 실제 목적에 대해 실제로주의를 기울이지 않는 한 약간 혼란 스럽습니다.

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

SerializableAttribute와 함께 사용하면 ISerializable Interface 및 SerializationInfo 클래스가 있습니다. BinaryFormatter 또는 SoapFormatter와 함께 만 사용됩니다.

Binary 또는 Soap을 사용하여 클래스를 직렬화하려는 경우 클래스를 [Serializable]로 표시하지 마십시오. XML 및 JSON 시리얼 라이저는 그 존재를 인식하지 못합니다.


16
"XML 또는 JSON 직렬화와 관련이 없습니다"-감사합니다! 마지막으로이 속성을 사용하거나 사용하지 않고 클래스를 XML로 행복하게 직렬화 할 수있는 이유에 대한 설명
userSteve

1
이것에 대한 소스가 있습니까?
Michiel van Oosterhout

"XML 및 JSON 시리얼 라이저는 그 존재를 인식하지 못합니다." 나는 그것에 대해 모른다. JSON이 WCF를 통해 클래스를 포맷하면 클래스가 인 경우 속성 이름이 앞의 밑줄 Serializable로 표시되고 속성이 제거되지 않은 경우 속성 이름이 제거되었습니다. 따라서 약간의 간섭이 가능합니다.
Jens

@Jens JSON.net을 올바르게 이해하면 조금 신경 쓰지 않지만 asp.net 은이 동작을 조금 변경합니다. JsonObject / JsonProperty 속성으로 이것을 피할 수 있다고 생각합니다.
자료

29

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

직렬화 작동 방식

이 그림은 전체 직렬화 프로세스를 보여줍니다.

여기에 이미지 설명을 입력하십시오

객체는 스트림으로 직렬화되며, 데이터뿐만 아니라 버전, 문화 및 어셈블리 이름과 같은 객체 유형에 대한 정보를 전달합니다. 해당 스트림에서 데이터베이스, 파일 또는 메모리에 저장 될 수 있습니다.

msdn의 세부 사항.



14

직렬화

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

직렬화 사용

  1. 객체의 상태를 파일, 데이터베이스 등에 저장하고 후자에 사용합니다.
  2. 동일한 시스템의 한 프로세스에서 다른 프로세스로 오브젝트를 전송하고 다른 시스템에서 실행중인 프로세스로 유선으로 오브젝트를 전송합니다.
  3. 기본 개체에서 작업하는 동안 원본 개체의 복제본을 백업으로 만듭니다.
  4. 일련의 개체를 시스템의 클립 보드에 쉽게 복사 한 후 동일하거나 다른 응용 프로그램에 붙여 넣을 수 있습니다.

다음은 객체를 직렬화하는 동안 사용되는 유용한 사용자 정의 속성입니다.

[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();
        }

    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.