2014-07-21 7 views
1

내 serializer는 속성 및 필드를 serialize합니다.
사용자 지정 복합 유형이 있으면 serializer가 작동하지 않습니다.
사용자 정의 복합 유형의 직렬화를 추가하고 순환 순회를 수행 할 수 있습니다. 프로그래밍에 익숙하지 않고 솔직히 재귀 순회를 다룰 기회가 없었습니다.재귀 순회를 통해 직렬화하는 방법은 무엇입니까?

internal class MySerializer 
{ 
    private Type targetType; 

    public MySerializer(Type targetType) 
    { 
     this.targetType = targetType; 
     if (!targetType.IsDefined(typeof (DataContractAttribute), false)) 
      throw new Exception("No soup for you"); 
    } 

    public void WriteObject(Stream stream, Object graph) 
    { 
     IEnumerable<MemberInfo> serializbleMembers = 
      targetType.GetMembers(BindingFlags.GetField | BindingFlags.GetProperty | BindingFlags.Instance | 
            BindingFlags.Public | BindingFlags.NonPublic) 
       .Where(p => p.IsDefined(typeof (DataMemberAttribute), false)); 
     var writer = new StreamWriter(stream); 
     writer.WriteLine("<" + targetType.Name + ">"); 
     foreach (MemberInfo memberInfo in serializbleMembers) 
     { 
      writer.Write("\t<" + memberInfo.Name + ">"); 
      var fieldInfo = memberInfo as FieldInfo; 
      if (fieldInfo != null) 
      { 
       writer.Write(fieldInfo.GetValue(graph).ToString()); 
      } 

      var propInfo = memberInfo as PropertyInfo; 
      if (propInfo != null) 
      { 
       writer.Write(propInfo.GetValue(graph, null).ToString()); 
      } 

      writer.Write("</" + memberInfo.Name + ">"); 
     } 
     writer.WriteLine("</" + targetType.Name + ">"); 
     writer.Flush(); 
    } 
} 


[DataContract] 
class Person 
{ 
    [DataMember] 
    public string _family; 
    [DataMember] 
    public string FirstName { get; set; } 
    [DataMember] 
    public string LastName { get; set; } 
    [DataMember] 
    public int Age { get; set; }  
} 
+0

귀하의 질문을 이해하는 한, 당신은 자신의 시리얼 라이저를 쓰고 싶습니까? 어떤 요구 사항을 강요하는지 자세히 설명해 주시겠습니까? 당신이 필요로하는 것을 성취 할 수있는 다른 가능성이있을 것입니다 ... – derape

+0

예, 당신은 정확하게 이해했습니다. 내가 호기심이기 때문에 나는 그것을 쓰고있다. 처음에 나는 내 자신의 간단한 serializer를 만들고 싶었다. 이제 사용자 정의 복합 유형을 직렬화하고 재귀 적 순회를 추가하려고하지만 어떻게해야하는지 모르겠습니다. – Vlad

답변

2

은 내가 당신이 찾고있는 생각하는 것이 먼저 잎을 모두 공격 할 수있는 객체의 post-order traversal, 그리고에 직렬화를 반환 :

내가 지금 가지고있는 것입니다 부모 개체. 매우 복잡한 객체를 탐색하면 stack overflow이 될 수 있으므로 반복적 인 방법보다는 반복적 인 방법을 사용하는 것이 좋지만이 경로를 사용하는 것이 좋습니다.

이 방법의 문제점은 직렬화되는 개체가 트리 인 경우에만 작동한다는 것입니다. 많은 경우 그들은 그렇지만 많은 객체 계층 구조는 실제로 직접 그래프입니다. 서로를 가리키는 두 개의 복잡한 객체를 쉽게 가질 수 있습니다.이 경우에는 무한히 횡단합니다.

관련 문제