2008-09-17 7 views
1

SOAP/XML을 사용하여 HashTable (또는 문자열 인덱서를 통해 가장 잘 탐색되는 데이터)을 직렬화하는 가장 좋은 방법은 무엇입니까?SOAP/XML 용 HashTable을 직렬화하는 가장 좋은 방법은 무엇입니까?

Foo의 속성이 Bar[] Bars 인 경우를 예로 들어 보겠습니다. Bar 개체에는 키와 값이 있습니다. 기본적으로이 다음과 같은 XML로 직렬화 :

{"Foo":["Bars":[{"Key":"key0","Value":"key1} ... ]}]} 

는 내가 정말 갖고 싶은 것은 더 근본적인 관계를 반영하기 위해이 직렬화이다 JSON,이가 직렬화

<Foo> 
    <Bars> 
    <Bar key="key0" value="value0"/> 
    ... 
    </Bars> 
</Foo> 

. 예를 들어,

<Foo> 
    <Bars> 
    <Key0 value="value0"/> 
    <Key1 value="value1"/> 
    ... 
    </Bars> 
</Foo> 

나는이 방법으로 SOAP에 직렬화 몇 가지 과제가 실현하지만, 더 나은이를 반영하는 스키마를 제공하는 가장 좋은 방법은 무엇입니까?

BarsCollection 개체를 만들고이 개체에서 사용자 지정 serialization을 정의하려고 시도했지만 해당 개체에서 실제로 serialization을 호출하지 않은 것 같습니다. 예 :

void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { 
    foreach (Bar bar in Bars){   
    info.AddValue(bar.Key. bar); 
    } 
} 

의견이 있으십니까? 가장 좋은 방법은 무엇입니까?

답변

1

나는 정말로 당신이 원하는 것이 구조를 더 잘 반영한다고 생각하지 않습니다. 이를 위해 스키마를 정의하려면 (XSD라고 생각하십시오.) 각각의 키를 별도의 사용자 정의 유형으로 지정하기 때문에 사전에 모든 잠재적 인 키를 알아야합니다. 개념적으로 Bars는 Key0, Key1 유형의 객체를 보유하는 객체 배열이며 value 속성을 포함하는 KeyN 클래스가 각각 있습니다. 첫 번째 직렬화가 실제로 기본 구조의 최상의 반영이라고 생각합니다. JSON에서 원하는 것처럼 "작동"하는 이유는 입력을 잃어 버리는 것입니다. 모든 것이 단지 객체 일뿐입니다. JSON을 사용하지 않는 이유에 대해 신경 쓰지 않는다면?

+0

맞습니다 - 이것은 정확히 똑같은 문제입니다 - 무한 수의 키가있을 수 있고, 다른 Foos는 다른 세트를 가질 수 있습니다. 분명히 백엔드에서는 데이터베이스에 일대 다 관계로 저장되어 있습니다. 지금 내가 더 염려하는 것은 API를 사용하기 쉽도록 만드는 것입니다. – tmarman

+0

실제로 어떻게 저장했는지에 관계없이 API 소비자는 속성이있는 객체처럼 보이는 구문을 멋지게 만들 수 있기를 바랍니다. 말이 돼? – tmarman

0

ISerializable은 xml serialization에 사용되지 않습니다. 이진 직렬화에 사용됩니다. IXmlSerializable을 구현하는 것이 좋습니다.

하지만 KeyedCollection이 생각하고있는 것처럼 직렬화한다고 생각합니다. 당신은 결코 요소가 클래스에 매핑되기 때문에 < key0 ... /> < key1 ... />을 얻지 못할 것입니다.

0

SOAP 확장에서 해시 테이블을 전달할 수 있습니다. 그렇게하면 원하는대로 직렬화 할 수 있습니다. 클라이언트 및 서버에 있어야하는이 코드에는 사용자 지정 코드가 있습니다.

+0

그래, 나는 소비자를 통제하지 않기 때문에 일반적으로 (그리고 .Net 플랫폼에서) 작동 할 무언가가 필요하다. – tmarman

0

SOAP 프로토콜의 기본 키가 누락 된 것 같습니다.

SOAP 프로토콜에 대해 내가 정말 좋아하는 것 중 하나는 WSDL 파일에 임의의 개체 (메서드 포함)를 정의하고 SOAP 프로토콜을 사용하여 한쪽 끝에서 다른 쪽 끝으로이 개체를 전달할 수 있다는 것입니다. 한쪽 끝에서 데이터를 직렬화 한 다음 다른 쪽 끝에서 직렬화를 해제 할 필요가 없습니다.

+0

나는 네가 무엇을 얻고 있는지 이해하지 못한다. 당연히, 나는 런타임이 저를 위해 그것을하고 있기 때문에 수동으로 직렬화 할 필요가 없습니다. 여기에 API를 구축하고 있으므로 내 목표는 직렬화 된 데이터를 소비자 (기본적으로 제어하지 않음)에서 "더 멋지게"보이게 만드는 것입니다. – tmarman

관련 문제