【问题标题】:how to serialize an object in soap format and add prefixes如何以soap格式序列化对象并添加前缀
【发布时间】:2013-12-18 09:10:40
【问题描述】:

我有一个对象,我正在使用 xml 序列化器对对象进行序列化。 序列化后我的数据看起来像这样

<?xml version="1.0" encoding="utf-8"?>
<doPaymentRequest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Credentials>
<accountId>101</accountId>
<userName>santosh@gmail.com</userName>
<password>1234</password>
</Credentials>
<custFirstName>santosh</custFirstName>
<custLastName>reddy</custLastName>
<ssn>1234</ssn>
<phoneNbr>1234567890</phoneNbr>
<PaymentRequest>
<ncpTranCode>10104587</ncpTranCode>
<tranType>PAY</tranType>
<Payment>
  <tranAmount>100</tranAmount>
  <paymentDateDate>2013-04-30</paymentDateDate>
  <tenderType>C</tenderType>
</Payment>
</PaymentRequest>
 <csoId>203</csoId>
 <csoStCode>8974</csoStCode>
 </doPaymentRequest>

但我的 xml 应该是这样的

   <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"   xmlns:req="http://xxxxxxxxxxxx" xmlns:com="http://xxxxxxxxxxxxxxxxxx">
             <soapenv:Header/>
                 <soapenv:Body>
                 <req:doPaymentRequest>
    <req:credentials>
     <com:accountId>*********</com:accountId>
      <com:userName>*********</com:userName>
       <com:password>*********</com:password>
             </req:credentials>
                <req:custFirstName>Test</req:custFirstName>
               <!-- Optional: -->
                 <req:custMiddleName>Test</req:custMiddleName>
                   <req:custLastName>Test</req:custLastName>
                 <req:ssn>7895</req:ssn>
                 <!-- Optional: -->
              <req:phoneNbr>1234567890</req:phoneNbr>
                   <req:paymentRequest>
                    <req:ncpTranCode>10104587</req:ncpTranCode>
                 <req:tranType>PAY</req:tranType>
                          <req:payment>
                        <req:tranAmount>100</req:tranAmount>
                         <req:paymentDateDate>2013-04-30</req:paymentDateDate>
                             <req:tenderType>C</req:tenderType>
                              </req:payment>
                            </req:paymentRequest>
                          <req:csoId>203</req:csoId>
                             <req:csoStCode>8974</req:csoStCode>
                   </req:doPaymentRequest>
               </soapenv:Body>
                 </soapenv:Envelope>

如何添加 req,com 等前缀。 我正在使用 XmlSerializer 将我的对象转换为 xml。 xmlSerializer.Serialize(stWriter, myobject);

有没有类似 SOAP 序列化的东西 ......编辑...... 我使用了 SoapFormatter 并将对象序列化并使用
将其转换为字符串 Encoding.ASCII.GetString(memStream.GetBuffer())

然后我的字符串看起来很奇怪,如下所示。

  <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:doPaymentRequest id="ref-1" xmlns:i2="http://schemas.xmlsoap.org/soap/envelope/">
         <_x003C_Credentials_x003E_k__BackingField href="#ref-4"/>
          <_x003C_custFirstName_x003E_k__BackingField id="ref-      5">santosh</_x003C_custFirstName_x003E_k__BackingField>
         <_x003C_custMiddleName_x003E_k__BackingField xsi:null="1"/>
           <_x003C_custLastName_x003E_k__BackingField id="ref-  6">reddy</_x003C_custLastName_x003E_k__BackingField>
         <_x003C_ssn_x003E_k__BackingField id="ref-7">1234</_x003C_ssn_x003E_k__BackingField>
            <_x003C_phoneNbr_x003E_k__BackingField id="ref-  8">1234567890</_x003C_phoneNbr_x003E_k__BackingField>
           <_x003C_PaymentRequest_x003E_k__BackingField href="#ref-9"/>
            <_x003C_csoId_x003E_k__BackingField id="ref-  10">203</_x003C_csoId_x003E_k__BackingField>
            <_x003C_csoStCode_x003E_k__BackingField id="ref-  11">8974</_x003C_csoStCode_x003E_k__BackingField>
          </i2:doPaymentRequest>
              <a1:credentials id="ref-4"   xmlns:a1="http://schemas.microsoft.com/clr/nsassem/MemoService/MemoService%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
             <_x003C_accountId_x003E_k__BackingField id="ref- 12">101</_x003C_accountId_x003E_k__BackingField>
             <_x003C_userName_x003E_k__BackingField id="ref-13">santosh@gmail.com</_x003C_userName_x003E_k__BackingField>
              <_x003C_password_x003E_k__BackingField id="ref-14">1234</_x003C_password_x003E_k__BackingField>
           </a1:credentials>
              <a1:paymentRequest id="ref-9"   xmlns:a1="http://schemas.microsoft.com/clr/nsassem/MemoService/MemoService%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
               <_x003C_ncpTranCode_x003E_k__BackingField id="ref-  15">10104587</_x003C_ncpTranCode_x003E_k__BackingField>
            <_x003C_tranType_x003E_k__BackingField id="ref-  16">PAY</_x003C_tranType_x003E_k__BackingField>
             <_x003C_Payment_x003E_k__BackingField href="#ref-17"/>
                </a1:paymentRequest>
                <a1:payment id="ref-17" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/MemoService/MemoService%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
              <_x003C_tranAmount_x003E_k__BackingField id="ref- 18 ">100</_x003C_tranAmount_x003E_k__BackingField>
               <_x003C_paymentDateDate_x003E_k__BackingField id="ref-19">2013-04-

            30</_x003C_paymentDateDate_x003E_k__BackingField>
                <_x003C_tenderType_x003E_k__BackingField id="ref-  

             20">C</_x003C_tenderType_x003E_k__BackingField>
          </a1:payment>
             </SOAP-ENV:Body>
                 </SOAP-ENV:Envelope>

我有什么遗漏吗...

【问题讨论】:

  • 为什么要这样做? ,同时看看stackoverflow.com/a/3256887/87956。仍然想要你想要达到的目标。
  • 为什么要这样做?您将如何处理 XML?将其发送到服务?那么为什么不首先使用服务引用来发送它呢?
  • 我的服务将调用另一个服务(比如说第三方服务)。这个第三方服务将把我的服务返回的 xml 作为输入。而且这个 xml 按原样存储在数据库中。有这个 xml 的格式,这个格式不能改变。所以我必须将我的对象序列化成这个 SOAP 格式

标签: soap xml-serialization soap-serialization


【解决方案1】:
[Serializable]
public class MyData 
{
    public int MyNumber { get; set; }
    public string Name { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        using (MemoryStream stream = new MemoryStream())
        {
            MyData data = new MyData() { MyNumber = 11, Name = "StackOverflow" };

            XmlSerializer serializerXML = new XmlSerializer(data.GetType());
            serializerXML.Serialize(stream, data);

            stream.Seek(0, SeekOrigin.Begin);

            data = (MyData)serializerXML.Deserialize(stream);

            // We're cheating here, because I assume the SOAP data
            // will be larger than the previous stream. 
            stream.Seek(0, SeekOrigin.Begin);

            SoapFormatter serializerSoap = new SoapFormatter();
            serializerSoap.Serialize(stream, data);

            stream.Seek(0, SeekOrigin.Begin);

            data = (MyData)serializerSoap.Deserialize(stream);
        }
    }
}

复制自https://stackoverflow.com/a/3256887/87956

【讨论】:

  • 使用 Soapfomatter 后,我正在尝试使用 Encoding.ASCII.GetString(stream.GetBuffer()); 转换为字符串。我的 SOPA 格式字符串在这里看起来很奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2022-07-06
相关资源
最近更新 更多