2012-02-21 2 views
2

EF 4 STE 그래프를 serialize하는 동안 매우 흥미로운 예외가 발생했습니다.EF DataContractSerializer 예외

 System.IndexOutOfRangeException was caught 
     Message=Index was outside the bounds of the array. 
     Source=mscorlib 
     StackTrace: 
     Server stack trace: 
      at System.Runtime.Serialization.ObjectReferenceStack.EnsureSetAsIsReference(Object obj) 
      at System.Runtime.Serialization.XmlObjectSerializerWriteContext.OnHandleIsReference(XmlWriterDelegator xmlWriter, DataContract contract, Object obj) 
      at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle) 
      ... 
      at System.Runtime.Serialization.XmlObjectSerializer.WriteObject(XmlDictionaryWriter writer, Object graph) 
      at System.Runtime.Serialization.XmlObjectSerializer.WriteObject(Stream stream, Object graph) 

내 직렬화 코드는 매우 간단하다 : 내 객체 그래프에서

using (MemoryStream memoryStream = new MemoryStream()) 
{ 
    DataContractSerializer dc = new DataContractSerializer(data.GetType()); 
    dc.WriteObject(memoryStream, data); 

    memoryStream.Flush(); 

    memoryStream.Position = 0; 
    StreamReader reader = new StreamReader(memoryStream); 
    var serializedObject = reader.ReadToEnd(); 
} 

, 나는 부모 엔티티에 몇 아이 엔티티를 추가 한, 내가 발견 한 나는를 호출하는 경우 그. 부모에 대한 AcceptChanges() 확장 메서드는 모든 것이 잘 serialize합니다.

다른 사람이 이런 문제가 발생 했습니까? 무엇 때문에 그 원인이 될 수 있습니까? 범인을 어떻게 내쫓을 수 있을지에 대한 아이디어가 있습니까?

업데이트 : 다른 사람이 비슷한 문제가있는 link을 발견했습니다. 그들은 System.Runtime.Serialization.ObjectReferenceStack.EnsureSetAsIsReference)가 몇 가지주기 유효성 검사를 수행 중이며 문제를 찾을 수 있다고 말했습니다.

업데이트 2 : DataContractSerializer의 생성자에서 preserveObjectReferences를 true로 설정하면 예외가 지워집니다.

업데이트 3 : preserveObjectReferences가 true로 설정된 오버로드 된 DataContractSerializer 생성자를 호출하려면 this article에 설명 된 방법을 사용하여 종료해야합니다. 가 어떻게 모두에 대한 것보다 다르게 DataContractSerializer에 preserveObjectReferences [DataContract (IsReference = TRUE)]이다 : 나는 아직도 그것을 설명 할 수 있지만이

가 가

그래서 어쩌면 지금, 내 질문이된다 ...이 문제를 해결 STE?

감사!

답변

1

PreserveObjectReferences는 모든 클래스에 대해 "비표준 XML 구문"을 사용하는 반면, isReference는 표준 SOAP 방식이지만 필요로하는 모든 클래스에서 선언해야합니다. 나는 똑같은 문제가 있었는데, 나는 그것을 일부 수업에 빠뜨리지 않았기 때문에 그랬다. 일반적인 트랩은 DataContractAttribute가 상속되지 않으므로 상속 된 각 클래스에 대해 다시 (IsReference = true로) 다시 선언해야한다는 것입니다.

관련 문제