2013-03-18 3 views
3

Я действительно ударил блокпост, пытаясь десериализовать список пользовательских объектов по службе WCF. Он использует .NET 4. Как мне обойти разные пространства имен. Мое приложение ASP.NET работает на 3.5, и эта ссылка настраивается нормально. Это может быть проблема? Как мне обойти это?Как десериализовать список настраиваемых объектов

Моя служба настроена так:

Контракт

namespace MyDomain.Services.Report 
{ 
    [ServiceContract(Name = "ICompanyReport")] 
    public interface ICompanyReport 
    { 
     [OperationContract] 
     byte[] GetFooReport(string fooName); 
    } 

    [Serializable] 
    [DataContract(Name="FooReportRecord", Namespace="MyDomain.com"] 
    public class FooReportRecord 
    { 
     [DataMember] 
     public int ID {get; set;} 
     [DataMember] 
     public string Name {get; set;} 
    } 

} 

svc.cs

public class CompanyReport: ICompanyReport 
{ 
    public byte[] GetFooReport(string fooName) 
    { 
     var data = new List<FooReportRecord>(); 

     // get data based on fooName and populate data 

     var ms = new MemoryStream(); 
     var bf = new BinaryFormatter(); 
     bf.Serialize(ms, data); 
     return ms.ToArray(); 
    } 
} 

стороне клиента:

var ls = proxy.GetFooReport("bar"); 
var bf = new BinaryFormatter(); 
var ms = new MemoryStream(ls); 

// Unable to find assembly MyDomain.Services.Report error is thrown 
var reportData = (List<FooReportRecord>)bf.Deserialize(ms); 
+2

Почему вы возвращаете байт [], а не FooReportRecord? – Phil

+0

Когда вы говорите: «Мое приложение ASP.NET работает на 3,5» - это ваш сервис WCF, размещенный на веб-сайте ASP.NET? или приложение ASP.NET является клиентом? Я предполагаю, что вы имеете в виду клиента здесь – EdmundYeung99

+0

Байт [] был попыткой сжать как можно больше списка объектов. Когда я тестировал, я мог получить больше результатов, используя массив байтов и фактический список. – HapiDjus

ответ

1

Предполагая, что ваш клиент - это приложение .NET 3.5, а FooReportRecord - в вашей библиотеке wcf .NET 4, вы получите ошибку времени компиляции.

Move FooReportRecord в библиотеку третьего класса скомпилирован в .NET 3.5 и ссылку на это как из вашего приложения WCF и клиента (ASP.NET)

Но, как упоминалось @Phil, почему бы не вернуться FooReportRecord [] вместо байта []

Сервис

public FooReportRecord[] GetFooReport(string fooName) 
{ 
    var data = new List<FooReportRecord>(); 

    // get data based on fooName and populate data 

    return data.ToArray(); 
} 

Client

var proxy = new ServiceReference1.CompanyReportClient(); 
FooReportRecord[] ls = proxy.GetFooReport("bar"); 
+0

Посмотрев на это весь день, я в конечном итоге сорвал всю свою причину, чтобы наброситься на мою службу отчетности до 4.0. Размер возвращаемых моих списков был слишком большим, чтобы попробовать десериализацию хакерских кросс-версий. Только когда я увидел «почему байт []», это заставило меня задать себе тот же вопрос. Спасибо за помощь! – HapiDjus