如何序列化soap格式的对象并添加前缀

时间:2013-12-18 09:10:40

标签: soap xml-serialization soap-serialization

我有一个对象,我使用xml seriliazer将对象序列化。 在对数据进行序列化之后,就像这样

<?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>

我在这里遗漏了什么...

1 个答案:

答案 0 :(得分:0)

[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

复制