2013-02-13 6 views
2

제가 작업중인 프로젝트에서 직렬화 된 객체의 메소드를 포함하고있는 JSON 표현을 사용해야합니다. 그게 내 자신의 serializer를 구현해야하는 이유입니다. Serializer는 리플렉션을 통해 매우 간단하게 구현됩니다. 내 문제는 원래 객체와 동일한 유형의 "자체 생성"속성을 가진 객체도 처리 할 수 ​​있어야한다는 것입니다.커스텀 JSON "자체 생성"속성을 가진 객체의 직렬화가 무한 루프로 끝납니다

예 : 나는 속성 새로운 오브젝트 ()가 생성되고, 시리얼 무한 재귀에 끝이 방법을 반복

class ClassA 
{ 
    private ClassA a; 
    public ClassA A 
    { 
     get 
     { 
      if (a == null) 
       a = new ClassA(); 
      return a; 
     } 
    } 
} 

매번.

어떤 생각을 어떻게 피할 수 있습니까? 모든 제안을 부탁드립니다.

답변

0

직렬화 중에 터치하지 않으려는 속성을 표시하는 속성을 만듭니다. 해당 속성없이 속성 만 serialize하십시오.

[AttributeUsage(AttributeTargets.Property)] 
public class DoNotSerializeAttribute : Attribute 
{ 
} 

사용법 : 당신이 속성을 결정하는 경우

class ClassA 
{ 
    private ClassA a; 

    [DoNotSerialize] 
    public ClassA A 
    { 
     get 
     { 
      if (a == null) 
       a = new ClassA(); 
      return a; 
     } 
    } 
} 

는 직렬화가 : 당신이 클래스를 변경할 수없는 경우

var properties = theType.GetProperties() 
    .Where(x => x.GetCustomAttributes(typeof (DoNotSerializeAttribute), true).Length == 0); 

, 당신은 명시 적 목록에 전달할 수 제외 할 속성 :

PropertyInfo[] exclude = new[]{ typeof(ClassA).GetProperty("A") };  
var properties = typeof(ClassA).GetProperties().Except(exclude); 
+0

답해 주셔서 감사합니다. 그러나 문제는 해당 프로그램이 인터페이스로만 사용하는 .dll 라이브러리의 일부이기 때문에 해당 클래스를 편집 할 수 없다는 것입니다. – JeFf

+0

답변을 업데이트 했으므로 명시 적으로 제외 할 속성 목록을 제공해야합니다. –

+0

글쎄, 그건 분명히 효과가있을 것이다. 방금보다 보편적 인 해결책을 찾고 싶었습니다. – JeFf