답변:
.Net 프레임 워크 응용 프로그램에서 개체를 만들 때 데이터가 메모리에 저장되는 방식에 대해 생각할 필요가 없습니다. .Net Framework가이를 처리하기 때문입니다. 그러나 객체의 내용을 파일로 저장하거나 다른 프로세스로 객체를 보내거나 네트워크를 통해 전송하려면 다른 형식으로 변환해야하므로 객체가 어떻게 표현되는지 고려해야합니다. . 이 변환을 직렬화라고합니다.
직렬화를 통해 개발자는 오브젝트의 상태를 저장하고 필요에 따라 다시 작성하여 오브젝트의 스토리지 및 데이터 교환을 제공 할 수 있습니다. 직렬화를 통해 개발자는 웹 서비스를 통해 원격 애플리케이션으로 오브젝트를 전송하거나 한 도메인에서 다른 도메인으로 오브젝트를 전달하거나 XML 문자열로 방화벽을 통해 오브젝트를 전달하거나 보안 또는 사용자 별 유지 보수와 같은 조치를 수행 할 수 있습니다. 응용 프로그램 간 정보.
SerializableAttribute
이 유형의 인스턴스가 직렬화 될 수 있음을 나타 내기 위해 유형에 적용하십시오 . SerializableAttribute
클래스 ISerializable
가 직렬화 프로세스를 제어 하기 위해 인터페이스를 구현하는 경우에도 적용하십시오 .
로 표시된 유형의 모든 공개 및 개인 필드 SerializableAttribute
ISerializable
직렬화 프로세스를 대체 하기 위해 인터페이스를 구현하지 않는 한 유형으로 기본적으로 직렬화됩니다. 기본 직렬화 프로세스는로 표시된 필드를 제외합니다 NonSerializedAttribute
. 직렬화 가능 유형의 필드에 포인터, 핸들 또는 특정 환경에 특정한 다른 데이터 구조가 포함되어 있고 다른 환경에서 의미있게 재구성 될 수없는 경우 NonSerializedAttribute
해당 필드 에 적용 할 수 있습니다.
자세한 내용은 MSDN 을 참조하십시오.
편집 1
무언가를 직렬화 가능으로 표시하지 않는 이유
데이터를 전송하거나 저장할 때 필요한 데이터 만 보내거나 저장해야합니다. 따라서 전송 지연 및 스토리지 문제가 줄어 듭니다. 따라서 직렬화 할 때 불필요한 데이터 청크를 옵트 아웃 할 수 있습니다.
[Serializable]
속성에 대한 몇 가지 실용적인 용도 :
BinaryFormatter
. System.Runtime.Serialization.Formatters.Binary 클래스를Clipboard.SetData()
직렬화 할 수없는 클래스를 배치 할 수 없습니다.MarshalByRefObject
)는 직렬화 가능해야합니다.이것들은 내가 만난 가장 일반적인 사용 사례입니다.
원래 질문은 SerializableAttribute에 관한 것이 었으므로이 특성은 BinaryFormatter 또는 SoapFormatter를 사용할 때만 적용됩니다.
세부 사항, 사용 시점 및 실제 목적에 대해 실제로주의를 기울이지 않는 한 약간 혼란 스럽습니다.
XML 또는 JSON 직렬화와는 아무런 관련이 없습니다.
SerializableAttribute와 함께 사용하면 ISerializable Interface 및 SerializationInfo 클래스가 있습니다. BinaryFormatter 또는 SoapFormatter와 함께 만 사용됩니다.
Binary 또는 Soap을 사용하여 클래스를 직렬화하려는 경우 클래스를 [Serializable]로 표시하지 마십시오. XML 및 JSON 시리얼 라이저는 그 존재를 인식하지 못합니다.
Serializable
로 표시되고 속성이 제거되지 않은 경우 속성 이름이 제거되었습니다. 따라서 약간의 간섭이 가능합니다.
직렬화는 객체를 저장하거나 객체를 메모리, 데이터베이스 또는 파일로 전송하기 위해 객체를 바이트 스트림으로 변환하는 프로세스입니다.
직렬화 작동 방식
이 그림은 전체 직렬화 프로세스를 보여줍니다.
객체는 스트림으로 직렬화되며, 데이터뿐만 아니라 버전, 문화 및 어셈블리 이름과 같은 객체 유형에 대한 정보를 전달합니다. 해당 스트림에서 데이터베이스, 파일 또는 메모리에 저장 될 수 있습니다.
다음은 직렬화 작동 방식에 대한 간단한 예입니다. 나는 또한 같은 것에 대해 배우고 있었고 두 개의 링크가 유용하다는 것을 알았습니다. 직렬화 란 무엇이며 .NET에서 수행 할 수있는 방법 입니다.
직렬화
직렬화는 객체 또는 객체 집합 그래프를 스트림으로 변환하는 프로세스이며, 이진 직렬화의 경우 바이트 배열입니다.
직렬화 사용
다음은 객체를 직렬화하는 동안 사용되는 유용한 사용자 정의 속성입니다.
[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();
}
}
What is it?
stackoverflow.com/questions/3429921/what-does-serializable-mean