Всем привет!
Подскажите — как бороться с сабжем?
Прилетает 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);
}
}