Как сериализовать / десериализовать сгенерированный код прокси WCF? - PullRequest
5 голосов
/ 08 сентября 2010

Я пытаюсь сериализовать / десериализовать сгенерированный код прокси веб-службы WCF из svcutil. Хотя я могу сериализовать объекты, я не могу десериализовать их обратно в объекты. Вот XML, который я сгенерировал посредством сериализации:

<RootObject xmlns="http://schemas.myco.com/online/sync/2008/11">
    <WrapperObject>
        <Objects>
            <SomeObject p4:type="Foo" ContextId="d5f9f021-b2a1-47ba-9f25-1e068194dc87" ObjectId="fad3ef87-3944-459d-b45b-1e4e52ef24db" xmlns:p4="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.myco.com/online/sync/2008/11" />
        </Objects>
      </WrapperObject>
</RootObject>

У меня есть пара вопросов:

  1. Я уже использую XmlSerializerNamespaces для объявления пространства имен, совпадающего с пространством имен, указанным в сгенерированном коде прокси. Почему же до сих пор есть тег «p4», который он добавил к тегу «SomeObject», и добавлено новое пространство имен xml (xmlns: p4 = "http://www.w3.org/2001/XMLSchema-instance").

        using (XmlWriter xmlWriter = XmlWriter.Create(stringBuilder, xmlSettings))
        {
            XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
            namespaces.Add(string.Empty, defaultNamespace);
    
            XmlSerializer serializer = new XmlSerializer(typeof(T), defaultNamespace);
            serializer.Serialize(xmlWriter, objectToBeSerialized, namespaces);
    
            return stringBuilder.ToString();
        }
    
  2. Когда я пытаюсь десериализовать XML с помощью следующего кода, я получаю следующую ошибку: «System.InvalidOperationException: при создании документа XML произошла ошибка. ---> System.Xml.XmlException: 'p4 : type 'является повторяющимся именем атрибута. "

        using (TextReader textReader = new StringReader(xmlString))
        {
            using (XmlReader xmlReader = XmlReader.Create(textReader))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(T), defaultNamespace);
                return (T)serializer.Deserialize(xmlReader);
            }
        }
    
  3. Код прокси генерируется svcutil для связи с веб-службой WCF. Все сгенерированные объекты сериализуются / десериализуются должным образом, когда я просто использую вызов веб-службы.

У кого-нибудь были подобные проблемы раньше?

1 Ответ

4 голосов
/ 02 мая 2012

WCF использует специализированные XML-сериализаторы для сериализации объектов, которые будут генерировать XML иначе, чем стандартный XmlSerializer. Вы можете использовать XmlSerializer, но вам нужно будет правильно приписать свой класс для объекта objectToBeSerialized. Возможно, лучше вместо этого использовать сериализаторы WCF.

Посмотрите на эту статью:

http://msdn.microsoft.com/en-us/magazine/cc163569.aspx

...