2011-09-29 4 views
1

RuntimeTypeModel.Default [typeof (IMyClass2)] AddSubType (1, typeof (MyClass)) "반복 된 데이터 (목록, 컬렉션 등)에 inbuilt 동작이 있으며 하위 클래스로 만들 수 없습니다"예외 발생 다음은 코드 스 니펫컬렉션 유형에 AddSubType을 사용하려면 어떻게해야합니까?

public partial class TestClass 
{ 
    public TestClass() 
    {   
    } 

    private void Serialize(object sender, EventArgs e) 
    { 
     Stream stream = new FileStream(resultFilePath, 
      FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); 

     RuntimeTypeModel.Default[typeof(IMyClass2)].AddSubType(1, typeof(MyClass)); 
     Serializer.Serialize(stream, myDict); 
     stream.Close(); 
    } 

    private void DeSerialize(object sender, EventArgs e) 
    { 
     Stream stream = new 
      FileStream(resultFilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); 

     Dictionary<int, IMyClass2> myNewDict = Serializer.Deserialize<Dictionary<int, IMyClass2>>(stream); 
     stream.Close(); 
    } 
} 

[ProtoContract] 
[Serializable] 
public class MyClass : IMyClass2 
{ 
    #region IMyClass2 Members 

    //members 

    #endregion 

    #region IEnumerable Members 

    public IEnumerator GetEnumerator() 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

public interface IMyClass2 : IMyClass1 
{ 
    //members 
} 

public interface IMyClass1 : IEnumerable 
{ 
    //members 
} 

이 예외는 어떻게 처리해야합니까? 도와주세요.

답변

1

protobuf-net은 귀하의 기본 유형에 콜렉션 유형이 있다고 결론을 냈습니다 (상당히 합리적으로). 컬렉션 (대부분의 다른 serializer 및 데이터 바인딩과 공통)은 개별 항목과 다르게 처리됩니다. "프로토콜 버퍼"에서 이것은 심지어 입니다. 컨테이너은 스트림에조차 존재하지 않기 때문에이 발음됩니다. 모두 직렬화되는 것은 개별 요소입니다. (: protobuf - 그물 XML과는 아무것도하지만,이 시각화하는 데 도움이 설명이) 하위 항목이 접근 방법이 있습니다 XML에 다음 :

<foo>     <foo> 
    <items>    <bar/> 
     <bar/>   <bar/> 
     <bar/>   <bar/> 
     <bar/>   </foo> 
    </items> 
</foo> 

은 XML의 관점에서이 문제를 설명하기 위해 그 중 protobuf-net은 의 예와 비슷할 것이며 일 것입니다. - 의 표현은 전혀 없습니다. 컨테이너의 (items)입니다. (구글 사양하지 protobuf-NET의 구현과 관련된)이 때문에

, 그것은 수있는 컬렉션에 특정하지 저장 아무것도, 그것은 상속 같은 모든 내역 (또한 을주의하는 것이 어디 필요가 없도록은 Google 사양에 없지만 개별 항목에 대해서는 해결할 수 있습니다.

간단히 말해서, 나는 "그렇게하지 마십시오"라고 제안합니다. 아마도 내가 시나리오를 조금 더 완벽하게 이해한다면 더 유용한 대답을 줄 수있을 것입니다. 이 개별 상품의 핸들 상속하므로 List<SomeBaseType>DerivedType1, DerivedType2YetAnotherDerivedType 인스턴스를 포함 할 수 있음 (상기 암시 됨)

참고.

+0

List {get; set;}의 속성이 직렬화 가능해야합니까? 이 "반복 된 데이터"예외는 어떤 이유로 든 – sgtz

+0

@sgtz에서 곧바로 작동합니다. (회원이 직렬화로 표시되어있는 한) 아무 것도 할 필요가 없습니다. 서브 클래 싱 된 * 목록이 있습니까? 구체적인 예가 있을까요? –

+0

[ProtoContract (IgnoreListHandling = true)]을 사용해야했고 사전을 비롯한 몇 가지 정적 속성도 [ProtoIgnore]에 부여해야했습니다. 감사. – sgtz

관련 문제