Как управлять пространством имен в .NET SoapFormatter? - PullRequest
3 голосов
/ 01 сентября 2009

Я пишу код, который должен быть обратно совместим с существующим кодом удаленного взаимодействия, использующим SOAP для сериализации некоторых объектов.

Моя сложность заключается в том, что мне пришлось переместить некоторые объекты в новые сборки, поэтому удаленное взаимодействие нарушено.

Например, я сериализую объект с помощью .NET SoapFormatter следующим образом:

Person p=new Person();
string path=@"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 выглядит так:

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

В этом XML я хотел бы иметь некоторый контроль над xmlns объекта a1: Person:

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

2 голосов
/ 01 сентября 2009

Мне удалось установить пространство имен с помощью атрибута SoapType.

[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:

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


Однако я не смог проверить десериализацию на другой стороне удаленного канала. Надеюсь, это поможет вам.

0 голосов
/ 01 сентября 2009

Вы пробовали SoapAttribute ? У него есть свойство XmlNamespace. Может быть, это сработает. Вы также можете использовать Reflector, чтобы увидеть, что делает SoapFormatter.Serialize. Вы можете получить некоторые идеи, которые вы можете попробовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...