[SoapFormatter] Parse Error, no assembly associated with Xml
От: LWhisper  
Дата: 07.09.15 07:35
Оценка:
Всем привет!
Подскажите — как бороться с сабжем?

Прилетает SoapException. Пытаюсь десериализовать Details. Получаю ошибку —
"Parse Error, no assembly associated with Xml key xsi MyType"
"Ошибка при синтаксическом анализе: отсутствует сборка, связанная с XML-ключом xsi MyType"
Особенно смущает "xsi". >_>

Стэк:
   в System.Runtime.Serialization.Formatters.Soap.SoapHandler.ProcessGetType(String value, String xmlKey, String& assemblyString)
   в System.Runtime.Serialization.Formatters.Soap.SoapHandler.ProcessType(ParseRecord pr, ParseRecord objectPr)
   в System.Runtime.Serialization.Formatters.Soap.SoapHandler.ProcessAttributes(ParseRecord pr, ParseRecord objectPr)
   в System.Runtime.Serialization.Formatters.Soap.SoapHandler.StartChildren()
   в System.Runtime.Serialization.Formatters.Soap.SoapParser.ParseXml()
   в System.Runtime.Serialization.Formatters.Soap.SoapParser.Run()
   в System.Runtime.Serialization.Formatters.Soap.ObjectReader.Deserialize(HeaderHandler handler, ISerParser serParser)


Содержимое ex.Details.InnerXml:
  <MyTypeNode xmlns="urn:myNameSpace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="MyType">
    <obj type="MyObj">value</obj>
  </MyTypeNode>


Модель в сборке:
[XmlType(Namespace = "urn:myNameSpace")]
[Serializable]
  public class MyType
  {
    private MyObj objField;

    public MyObj obj
    {
      get
      {
        return this.objField;
      }
      set
      {
        this.objField = value;
      }
    }
  }


Десериализация:
SoapFormatter formatter = new SoapFormatter();
//formatter.AssemblyFormat = FormatterAssemblyStyle.Simple; // Пытался отключить строгое соответствие имени сборки - 0 эффекта
//formatter.Binder = new Binder(); // Пытался использовать кастомный байндер - в BindToType даже не заходит

//byte[] preamble = Encoding.UTF8.GetBytes("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); // Пытался добавить заголовок с указанием кодировки (смущает xsi) - не помогло
//byte[] bytes = Encoding.UTF8.GetBytes(soapEx.Detail.InnerXml);

using(var ms = new MemoryStream(Encoding.UTF8.GetBytes(soapEx.Detail.InnerXml)))
{
    HeaderHandler handler = new HeaderHandler((h) => { Console.WriteLine(h); return h; }); // Пытался залогировать хоть что-нибудь - не попадает сюда
    object result = formatter.Deserialize(ms, handler);
    Console.WriteLine(result);
}

internal sealed class Binder : SerializationBinder
{
    private static readonly Assembly _assembly = Assembly.Load("MyAssembly");

    public override Type BindToType(string assemblyName, string typeName)
    {
        return _assembly.GetType(typeName);
    }
}
Отредактировано 07.09.2015 7:43 LWhisper . Предыдущая версия . Еще …
Отредактировано 07.09.2015 7:40 LWhisper . Предыдущая версия .
soap parse formatting serialization
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.