2016-09-29 5 views
1

I는 다음과 같이 보이는 코드 조각이 :정적 읽기 전용 멤버에 대한 참조를 직렬화

이 는, obj가 더 이상 같은 객체
public static class MyStaticClass 
{ 
    public static readonly MyObject1 object1 = new MyObject1(); 
} 

[Serializable] 
public class MyOtherClass 
{ 
    public MyObject1 Obj { get; } = MyStaticClass.object1; 
} 

MyOtherClass의 인스턴스를 (기본 바이너리 직렬화를 사용하여) 역 직렬화입니다 을 MyStaticClass.object1과 같습니다. 해당 참조를 자동으로 유지할 수있는 방법이 있습니까? 아니면 간단히 문자열이나 다른 식별자를 통해 다시 구성해야합니까? 그렇다면, 그 참조를 깔끔하게 재건 할 수있는 추천 방법은 무엇입니까?

+0

예, ['IObjectReference. GetRealObject()'] (https://msdn.microsoft.com/en-us/library/system.runtime.serialization.iobjectreference.getrealobject (v = vs.110) .aspx). 이 작업을 수행하는 예는 [docs] (https://msdn.microsoft.com/en-us/library/system.runtime.serialization.iobjectreference.getrealobject (v = vs.110) .aspx # Anchor_3). – dbc

+0

* 기본 이진 직렬화 *는 'BinaryFormatter'을 의미합니다. 맞습니까? – dbc

+1

관련 항목 : [정적 참조 객체를 직렬화 및 비 직렬화하는 방법은?] (https://stackoverflow.com/questions/32375207/how-to-serialize-deserialize-static-reference-object/32509817#32509817) 및 [ deserialization process] (https://stackoverflow.com/questions/12692860/hooking-into-the-deserialization-process)를 참조하십시오. – dbc

답변

0

자동으로 "자동으로"당신의 정의에 따라 해당 참조

을 유지할 수있는 방법이 있지만, 대답은 "아니오"입니다 "추가 코드를 작성하지 않고"을 의미 가정.

일련 번호는 개체가 아니라 데이터를 처리합니다. 객체를 deserialize 할 때, 저장 역 직렬화 구현이 알고있는 것은 모두 저장된 데이터입니다. 그것이 있어야하는 그대로입니다. 범용 비 직렬화 구현은 그와 같은 객체를 찾을 위치를 알지 못하고 기존 참조를 사용하므로 전체 메모리 내 객체 그래프를 모든 루트에서 검색해야합니다.

이 문제를 명시 적으로 처리 할 메커니즘을 제공해야합니다. 어떤 직렬화 방법을 사용하는지에 따라 전체 프로세스를 사용자 정의하여 MyObject1 데이터 전체를 직렬화 할 필요는 없지만 사용자 정의 직렬화를 사용하여 해당 데이터를 나타내는 데 사용할 수있는 일종의 마커 만 저장하면됩니다. 원래 개체입니다.

또는 사용자 정의는 MyObject1 일부 유형의 동등성을 사용하므로 두 객체가 동일한 경우 해당 객체를 비교하여 해당 참조를 "stock"참조로 바꿀 수 있습니다.

IObjectReference.GetRealObject() (in the comments)을 지원하는 직렬화 방법을 사용하는 경우에도 마찬가지입니다.

하지만 무엇을 하든지 직접해야합니다. (또는 상자 및 hellip과 같은 기능을 지원하는 타사 라이브러리를 사용하십시오. 아무 것도 모르지만 존재하지 않는다는 것을 의미하지는 않습니다.)

+0

당신이 말한 것처럼 마커를 저장하는 가장 좋은 방법은 올바른 마커를 반환하기 위해 마커를 분석하는 MyStaticClass 메소드를 사용하는 것입니다. 귀하의 의견을 보내 주셔서 감사합니다! –

관련 문제