2009-08-31 4 views
3

일부 개체를 직렬화하기 위해 SOAP를 사용하는 기존 원격 코드와 하위 호환이 가능한 코드를 작성 중입니다..NET SoapFormatter에서 네임 스페이스를 제어하는 ​​방법?

어려운 점은 리모콘이 손상되어 일부 개체를 새 어셈블리로 옮겨야한다는 것입니다.

Person p=new Person(); 
string [email protected]"c:\myfile.soap"; 
using (System.IO.FileStream fs = new System.IO.FileStream(path, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write)) 
{ 
    System.Runtime.Serialization.Formatters.Soap.SoapFormatter 
    f = new System.Runtime.Serialization.Formatters.Soap.SoapFormatter(); 
    f.Serialize(fs, p); 
    fs.Close(); 
} 

결과 XML은 다음과 같습니다 :

예를 들어, 내가이 같은 .NET SoapFormatter를 사용하여 객체 직렬화하는 XML에서

<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
    <SOAP-ENV:Body> 
     <a1:Person id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/Serialization/dotneat_net.Serialization%2C%20Version%3D0.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull"> 
      <FirstName id="ref-3">Joe</FirstName> 
      <LastName id="ref-4">Doe</LastName> 
      <_Address id="ref-5">dotneat.net Street, Zaragoza, Spain</_Address> 
      <_ZIPCode id="ref-6">50007</_ZIPCode> 
     </a1:Person> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

를, 내가 가지고 싶습니다 a1 : Person 객체의 xmlns에 대한 일부 제어 :

<a1:Person id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/Serialization/dotneat_net.Serialization%2C%20Version%3D0.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull"> 

이유는 새 Person 객체가 원래 개체와 동일한 어셈블리에 있지 않습니다. 따라서 나중에 (더 오래된 프로젝트에서) 비 직렬화가 발생하면 잘못된 어셈블리로 인해 실패합니다.

xmlns의 텍스트를 어떻게 제어 할 수 있습니까? 직렬화되는 클래스에서 [SoapType Namespace = "xxx"] 특성을 사용하는 것과 같은 몇 가지 방법을 시도했습니다. 불운.

XML을 수동으로 수정하지 않는 것이 좋습니다.

답변

2

SoapType 특성을 사용하여 네임 스페이스를 설정할 수있었습니다. 나는 원격 채널의 다른 측면에 직렬화를 확인할 수 없습니다, 그러나

<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
    <SOAP-ENV:Body> 
    <i2:Person id="ref-1" xmlns:i2="MY_NAMESPACE"> 
     <FirstName id="ref-3">John</FirstName> 
     <LastName id="ref-4">Doe</LastName> 
     <_Address id="ref-5">otneat.net Street, Zaragoza, Spain</_Address> 
     <_ZIPCode id="ref-6">50007</_ZIPCode> 
    </i2:Person> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 


:

[Serializable] 
[System.Runtime.Remoting.Metadata.SoapType(XmlNamespace = "MY_NAMESPACE")] 
public class Person 
{ 
    public string FirstName; 
    public string LastName; 
    public string _Address; 
    public string _ZIPCode; 
} 


다음과 같은 직렬화 된 XML을 생성합니다. 바라기를, 그게 너를 돕는다.

+0

나는 이것을 시도 할 것이다. 나는 이것을 시도했다고 생각했지만, 나는 할 수도있다 : XmlNameSpace 대신 [SoapType (NameSpace = "MY_NAMESPACE"). 그만한 가치가있어, 고마워. –

+1

XmlNameSpace = ... 키입니다. 감사. –

0

SoapAttribute을 사용해 보셨습니까? XmlNamespace 속성이 있습니다. 그게 효과가있을 수 있습니다. Reflector를 사용하여 SoapFormatter.Serialize가 수행중인 작업을 볼 수도 있습니다. 시도 할 수있는 아이디어를 얻을 수 있습니다.

관련 문제