【问题标题】:Applying SoapIgnore attribute doesn't take any effect to serialization result应用 SoapIgnore 属性对序列化结果没有任何影响
【发布时间】:2011-01-18 00:22:46
【问题描述】:

我正在尝试找出 .NET 序列化的东西并遇到问题。我制作了一个简单的程序来测试它,并被使用属性卡住了。代码如下:

[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 在序列化完成时不会被忽略。我在 .inv 文件中得到的是这样的:

<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 属性不应该被序列化,因为它应用了 SoapIgnore 属性。我错过了什么吗?

【问题讨论】:

    标签: .net xml serialization soap xml-serialization


    【解决方案1】:

    这些属性用于标准 Web 服务 XML 序列化。 SoapFormatter 用于远程序列化而不是 Web 服务序列化。

    为了让您的示例工作,您应该为 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);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      • 1970-01-01
      • 2021-06-17
      相关资源
      最近更新 更多