2009-08-13 5 views
1

У меня есть простой класс, скажем, «Команда», и я предоставляю службу WCF (basicHttpBinding, размещенную в IIS) с помощью операции GetTeams, которая возвращает массив Team.Deserialization не работает в WCF

класс

Команда выглядит

[DataContract] 
public class Team 
{ 
    [DataMember] 
    public int Id { get; set; } 
    [DataMember] 
    public Point Position { get; set; } 
    [DataMember] 
    public string Code { get; set; } 
    [DataMember] 
    public bool Available { get; set; } 
    [DataMember] 
    public string Extra { get; set; } 
    [DataMember] 
    public double X { get; set; } 
    [DataMember] 
    public double Y { get; set; } 
} 

На клиенте (Silverlight 3.0 приложения) я получаю все данные, но свойство Позиция хранит экземпляр по умолчанию точки. Строка Point - это System.Windows.Media.Point, которая является сериализуемой. Я также добавил свойства X и Y, чтобы дублировать данные позиции, чтобы увидеть, правильно ли это происходит на другом конце провода.

XML-перехвачена (! Спасибо, Firebug) выглядит так:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
<s:Body> 
    <GetTeamsResponse xmlns="http://tempuri.org/"> 
     <GetTeamsResult xmlns:a="http://schemas.datacontract.org/2004/07/MyProject.Data" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
      <a:Team> 
       <a:Code>A23HJGF23</a:Code> 
       <a:Available>true</a:Available> 
       <a:Extra i:nil="true"/> 
       <a:Id>1</a:Id> 
       <a:Position xmlns:b="http://schemas.datacontract.org/2004/07/System.Windows"> 
        <b:_x>572194.59937858</b:_x> 
        <b:_y>322518.3889979</b:_y> 
       </a:Position> 
       <a:X>572194.59937858</a:X> 
       <a:Y>322518.3889979</a:Y> 
      </a:Team> 
      <!-- other <a:Team> elements --> 
     </GetTeamsResult> 
    </GetTeamsResponse> 
</s:Body> 
</s:Envelope> 

Поэтому кажется, что есть проблема десериализации. Исключено исключение!

Почему?

ответ

1

Как быстро уточняется, ваша служба WCF возвращает класс .net 3/3.5, в то время как SL пытается использовать класс точек SL? Или они оба относятся к одной и той же структуре точки.

Я думаю, что вы передаете версию .Net версии SL, потому что это пространство имен в позиции datacontract, похоже, указывает на использование точки CLR/WPF, которая не совпадает с точкой SL.

Конечная точка WCF будет использовать ISerializable для изменения XMLSerializer вместо сериализатора данных, поэтому вы увидите данные, но как пользовательский класс с _x и _y, которые вы видите в XML в настоящее время.

Редактировать:

Для ясности над местоположения STRUCT

SL3 Точка Struct находится в System.Windows.DLL (http://msdn.microsoft.com/en-us/library/system.windows.point(VS.95).aspx) .Net 3.0 Точка Struct в WindowsBase.dll (http://msdn.microsoft.com/en-us/library/system.windows.point(VS.85).aspx) .Net 3.5 Точечная структура в WindowsBase.dll (http://msdn.microsoft.com/en-us/library/system.windows.point.aspx)

Такое же имя, но не тот же класс, однако при сравнении .net с SL.

И немного добавления, которое происходит в SL 2.0 и сообщается на веб-сайте SL. (http://silverlight.net/forums/t/26577.aspx)

+0

Структура System.Windows.Point является частью .NET 3.0 и выше в сборке WindowsBase. Silverlight относится к той же структуре. –

+0

SL Точка находится в C: \ Program Files \ Reference Assemblies \ Microsoft \ Framework \ Silverlight \ v3.0 \ System.Windows.dll .Net3.5 Точка находится в папке C: \ Program Files \ Reference Assemblies \ Microsoft \ Framework \ v3.0 \ WindowsBase.dll В моем браузере объектов у меня есть две различные структуры Point, 1 для SL, 1 для .Net 3.0 - проверка. – Andrew

+0

, который должен быть точкой .net3.0, очевидно, учитывая имя папки фреймворка 3.0. – Andrew

1

Похоже, клиент не распознает тип данных Точка.

Как вы указываете System.Windows.Media.Point находится в .Net 3.0 и Silverlight.

Вы можете попробовать объявить Point как System.Windows.Media.Point в контракте с вашими данными. Также убедитесь, что ссылка на необходимую dll указана в проекте клиента.

Смежные вопросы