우선 당신이 유형이 클라이언트와 서버가 공유하는 하나의 웹 방법으로 임의의 유형을 전달하려는 가정합니다.
XmlSerializer를 보내는 데 많은 포인트가 없으며 serialize/deserialize 논리 만 있습니다. 스트림에 읽기/쓰기되는 실제 데이터가 없습니다. 당신이해야 할 일은 문자열 또는 XmlNode 중 하나를 전달하는 것입니다.
웹 서비스의 호출자는 XmlSerializer의 클라이언트 측 인스턴스를 사용하여 개체를 문자열로 serialize 한 다음 문자열을 인수로 전달하는 웹 메서드를 호출 할 수 있습니다. 자체적으로 구현 한 웹 메서드는 XmlSerializer의 인스턴스를 만들고 개체를 다시 역 직렬화하여 개체에 넣을 수 있습니다. 물론 serializer를 만들기 위해 루트 형식을 알아야하는 serializer의 서버 크기 인스턴스를 만들려면이 형식을 형식 이름으로 전달하고 Type.GetType()을 사용하여 XmlSerializer에 전달할 올바른 형식을 가져올 수 있습니다.
전달할 유형을 미리 알고 있다면 웹 메소드를보다 강력하게 유형을 선언하고 수신 할 것으로 예상되는 유형의 메소드를 명시 적으로 작성할 수 있습니다.
와이어 형식이 너무 중요하지 않은 경우 사용자 SoapFormatter
또는 BinaryFormatter
을 사용하여 직렬화/직렬화를 처리 할 수 있습니다. 나중에 BinaryFormatter의 경우 byte[]
인수를 취하는 웹 메서드를 선언 할 것이므로이 포맷터 (serializer)의 장점은 포맷터의 인스턴스를 만들 때 형식에 대한 추가 정보가 필요 없다는 것입니다. XmlSerializer를 사용하여 추가 몇 가지 간단한 예 (테스트되지 않은)
예, 여기 클라이언트 측에서 유형 이름을 전달해야합니다, 그래서 그것을 추가로 인수했다 :
업데이트 XmlSerializer를보다 느리게 될 . 경우 BinaryFormatter를 사용
[WebMethod]
public void Reports(string xml, string typeName)
{
XmlSerializer xs = new XmlSerializer(Type.GetType(typeName));
object obj = xs.Deserialize(new StringReader(xml));
// use the deserialize object
}
예는, 어떤 종류의 이름이 필요하지 않습니다하지만 당신은 같은 것을 사용하는 것이 당신의 클래스 유형은 클라이언트 측에서 serializable
[WebMethod]
public void Reports(byte[] data)
{
BinaryFormatter bf = new BinaryFormatter();
object obj = bf.Deserialize(new MemoryStream(data));
// use the deserialized object
}
를해야합니다하여 경우 BinaryFormatter를 사용하여 직렬화 다음과 같습니다.
// initialize the SystemInfo instance that you want to pass to the server
SystemInfo si = new SystemInfo() { SystemName = "My System" };
// Serialize to a memory stream
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, si);
// Call the service, passing the array from the memory stream
ws.Reports(ms.ToArray());
왜, 텍스트 상자에 직렬화된다? SystemInfo를 받아들이도록 WebMethod를 정의 해보십시오. – Cheeso
Ups, thats not there .. 내가 로컬로 테스트하고있었습니다. 클래스를 보내려면 Object를 보낸 다음 클래스에 캐스트하십시오. – pee2002