2010-02-17 3 views
1

.NET serialization 항목을 파악하고 문제가 발생했습니다. 나는 그것을 테스트하기위한 간단한 프로그램을 만들었고 속성을 사용하는 데 어려움을 겪었다. 코드는 다음과 같습니다.SoapIgnore 특성을 적용해도 serialization 결과에 아무런 영향을 미치지 않습니다.

[Serializable] 
public class SampleClass 
{ 
    [SoapIgnore] 
    public Guid InstanceId 
    { 
     get; 
     set; 
    } 
} 

class Program 
{ 
    static void Main() 
    { 

     SampleClass cl = new SampleClass { InstanceId = Guid.NewGuid() }; 
     SoapFormatter fm = new SoapFormatter(); 
     using (FileStream stream = new FileStream(string.Format("C:\\Temp\\{0}.inv", Guid.NewGuid().ToString().Replace("-", "")), FileMode.Create)) 
     { 
      fm.Serialize(stream, cl); 
     } 
    } 
} 

문제는 직렬화가 수행되는 동안 InstanceId가 무시되지 않는다는 것입니다. SoapIgnore 속성이 적용되기 때문에

<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:SampleClass id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/TestConsoleApp/TestConsoleApp%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull"> 
<_x003C_InstanceId_x003E_k__BackingField> 
<_a>769807168</_a> 
<_b>27055</_b> 
<_c>16408</_c> 
<_d>141</_d> 
<_e>210</_e> 
<_f>171</_f> 
<_g>30</_g> 
<_h>252</_h> 
<_i>196</_i> 
<_j>246</_j> 
<_k>159</_k> 
</_x003C_InstanceId_x003E_k__BackingField> 
</a1:SampleClass> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

나는 문서에서 InstanceID 속성에서 이해할 수 있듯이

직렬화 할 예정되지 않은 : 내가 .inv 파일에 도착하면이 같은 것입니다. 내가 놓친 게 있니?

답변

0

특성은 표준 웹 서비스 XML serialization 용입니다. SoapFormatter는 웹 서비스 직렬화가 아닌 원격 직렬화를위한 것입니다.

예제 작업을 수행하려면 SOAP로 인코딩 된 메시지 부분에 대한 유형 매핑을 제공해야합니다.

[Serializable] 
public class SampleClass 
{ 

    [SoapIgnore] 
    public Guid InstanceId 
    { 
     get; 
     set; 
    } 
} 

class Program 
{ 
    static void Main() 
    { 

     SampleClass cl = new SampleClass { InstanceId = Guid.NewGuid() }; 
     XmlTypeMapping xtm = new SoapReflectionImporter().ImportTypeMapping(typeof(SampleClass)); 
     XmlSerializer xs = new XmlSerializer(xtm); 

     using (FileStream stream = new FileStream(string.Format("C:\\Temp\\{0}.inv", Guid.NewGuid().ToString().Replace("-", "")), FileMode.Create)) 
     { 
      xs.Serialize(stream, cl); 
     } 
    } 
} 
관련 문제