2010-05-29 3 views
2

WebService를 통해 XmlSerializer 클래스 (원격 C# 응용 프로그램에서 명백하게 생성 됨)를 보내고 싶으면 클래스로 deserialize합니다.WebService에 XmlSerializer 클래스를 보낸 다음이를 deserialize하는 방법은 무엇입니까?

 XmlSerializer mySerializer = new XmlSerializer(typeof(SystemInfo)); 
     StreamWriter myWriter = new StreamWriter(textBox1.Text); 
     mySerializer.Serialize(myWriter, sysinfo); 

어떻게 내가 WebService에를 구축 할 수 있습니다 : 나는 이런 식으로 직렬화하고있어

SystemInfo 

:

내 클래스는 (나도 그것에게 그것의 수 몰랐어요)?

[WebMethod] 
    public void Reports(XmlSerializer xmlSerializer) 
    { 
     . 
     . 
     . 
    } 

나를 도와 줄 수있는 사람이 있습니까?

안부

+1

왜, 텍스트 상자에 직렬화된다? SystemInfo를 받아들이도록 WebMethod를 정의 해보십시오. – Cheeso

+0

Ups, thats not there .. 내가 로컬로 테스트하고있었습니다. 클래스를 보내려면 Object를 보낸 다음 클래스에 캐스트하십시오. – pee2002

답변

1

크리스, 나를 도와 주셔서 감사합니다. 그것은 중요한 발전이었습니다.

 SystemInfo sysinfo = new SystemInfo(); 
     sysinfo.RUN(); 

     XmlSerializer mySerializer = new XmlSerializer(typeof(SystemInfo)); 

     MemoryStream memStream = new MemoryStream(); 
      mySerializer.Serialize(memStream, sysinfo); 
      memStream.Seek(0, System.IO.SeekOrigin.Begin); 
      XmlDocument doc = new XmlDocument(); 
      doc.Load(memStream); 
     memStream.Close(); 

     localhost.WS_Agente dasdsa = new localhost.WS_Agente(); 
     dasdsa.Reports(doc.InnerXml); 

그리고 WebService에 :

[WebMethod] 
    public void Reports(string xml) 
    { 
     XmlSerializer mySerializer = new XmlSerializer(typeof(SystemInfo)); 
     SystemInfo obj = (SystemInfo)mySerializer.Deserialize(new StringReader(xml)); 
    } 

그것의 지금 매력 :

내 질문은 같이 작업 :

은 내가 XML 문자열을 보내는 문제를 해결 내가 향상시킬 수 있습니다 코드? 당신이 웹 서비스를 호출 할 경우

감사

+0

귀하의 솔루션을 살펴보면,이 질문에 대한 대답은 "당신이 어떤 타입을 전달할 것인지 미리 아는 경우 웹 메소드를보다 강력하게 유형을 선언하고 명시 적으로 원하는 유형의 메소드를 작성할 수 있습니다 접수 ". 코드가 SystemInfo와 함께 작동하도록 하드 코딩되었으므로 이제 해당 메서드가 해당 형식의 인수를 수락하도록 만드는 이유는 무엇입니까? [WebMethod] public void Reports (SystemInfo si) {...}. 인수가 본질적으로 동적 인 경우에만 직렬화가 필요합니까? –

+0

다른 질문에 대답하려면 StringWriter를 사용하여 클라이언트 코드를 조금 더 간단하게 만들 수 있습니다. 이처럼 XmlSerializer xs = 새 XmlSerializer (typeof (SystemInfo)); StringWriter sw = new StringWriter(); xs.Serialize (sw, si); ws.Reports (sw.ToString()); –

+0

정말 고마워요! 지금은 위대한! 당신은 남자입니다! – pee2002

3

우선 당신이 유형이 클라이언트와 서버가 공유하는 하나의 웹 방법으로 임의의 유형을 전달하려는 가정합니다.

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()); 
+0

흠, 이제 이해가 되네요. 당신은 serialize가 끝난 후에 저의 예제를 들려 줄 수 있습니까? – pee2002

+0

@ pee2002, 귀하의 의견이 들어 왔을 때 죄송합니다 편집하고 있었으므로 지금 간단한 예제를 추가하겠습니다. –

+0

죄송합니다, 작동하지 않음 : \ 입력 오류가 발생했습니다 : "입력 스트림이 유효한 이진 형식이 아닙니다. 바이트의 시작 내용은 다음과 같습니다. 3C-3F-78-6D-6C-20-76-65-72 -73-69-6F-6E-3D-22-31-2E ... " – pee2002

관련 문제