2010-01-07 3 views
1

IXmlSerializable을 사용하여 보내는 XML에 특정 유형의 요소를 작성하고 있습니다. 스키마를 구현했으며 항목을 쓰고 있습니다. 다음 코드는 예제입니다.IXmlSerializable에서 참조 찾기

public void IXmlSerializable.WriteXml(XmlWriter writer) { 
    // Write Out Class. 
    foreach (var item in myItems) { 
    DataContractSerializer ds = new DataContractSerializer(typeof(MyType)); 
    ds.WriteObject(writer, item); 
    } 
} 

내가 가진 문제는합니다 MyType 사용 참조 항목이 이미 참조 할 필요가있는 XML로 작성되었습니다 그래서

[DataContract(IsReference = true)] 
public class MyType { ... 

로 선언한다는 것입니다.

이미 XML에 참조가 작성되었는지 어떻게 알 수 있습니까? 나는 내가 명시 적으로 통제 할 수없는 참조를 무시해야한다고 생각합니다. 그렇게하면 내 자신의 참조 ID를 만들고 자신의 인스턴스를 참조합니다.

중복되지 않아야하는 참조를 복제하므로 이는 분명히 해킹 된 타협입니다.

이미 직렬화 된 항목의 ID를 찾을 수 있는지 이미 확인 된 내용을 확인할 수있는 방법이 있습니까?

감사합니다.

크레이그.

답변

0

"IsReference"마술은 단일 "에피소드"내의 일련 번호에 대해서만 작동합니다. 에피소드는 단일 WriteObject 호출입니다.

[DC]  
class Container 
    { 
     [DM] 
     MyType i1 = new MyType(); 
     [DM] 
     MyType i2 = i1;; 
     [DM] 
     MyType i3 = i1; 
    } 

지금, 당신은 WriteObject를 호출을 통해서 컨테이너의 인스턴스를 직렬화한다면, 그 :

의 당신이 아래 같은 일부 최상위 타입의 최상위 객체를 가지고 있었다 가정 해 봅시다 "ids"와 "refs"가 작동 할 때입니다. i1이 직렬화되면 ID가 1로 직렬화되지만 i2와 i3이 직렬화되면 각각은 MyType의 ID 1을 가리키는 "REF"특성으로 직렬화됩니다.

예에서 WriteObject에 대한 모든 호출은 별도의 에피소드이기 때문에 각 호출은 전체 개체 그래프를 직렬화합니다. 다른 MyType 인스턴스를 모두 상위 레벨 개체 (또는 컬렉션)로 패키징 할 수 없다면 운이 없어진 것입니다. 이것이 바로 당신이해야 할 일입니다 - 근본적으로 MyType의 모든 인스턴스가 하나의 상위 레벨 WriteObject 호출 내에서 직렬화되도록합니다.

관련 문제