Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何反序列化自定义对象列表_C#_.net_Wcf_Asp.net 3.5 - Fatal编程技术网

C# 如何反序列化自定义对象列表

C# 如何反序列化自定义对象列表,c#,.net,wcf,asp.net-3.5,C#,.net,Wcf,Asp.net 3.5,我在试图通过WCF服务反序列化自定义对象列表时遇到了一个障碍。它使用的是.NET4。如何绕过不同的名称空间。我的ASP.NET应用程序在3.5上运行,参考设置正常。这可能是问题所在吗?我怎样才能避开它 我的服务设置如下: 合同 namespace MyDomain.Services.Report { [ServiceContract(Name = "ICompanyReport")] public interface ICompanyReport { [Opera

我在试图通过WCF服务反序列化自定义对象列表时遇到了一个障碍。它使用的是.NET4。如何绕过不同的名称空间。我的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;}
   }

}
var proxy = new ServiceReference1.CompanyReportClient();
FooReportRecord[] ls = proxy.GetFooReport("bar");
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();
    }
}
公共类公司报告:ICompanyReport
{
公共字节[]GetFooReport(字符串fooName)
{
var data=新列表();
//基于fooName获取数据并填充数据
var ms=新内存流();
var bf=新的二进制格式化程序();
序列化(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);
var ls=proxy.GetFooReport(“bar”);
var bf=新的二进制格式化程序();
var ms=新的内存流(ls);
//找不到程序集MyDomain.Services。引发报告错误
var reportData=(列表)bf.反序列化(ms);

假设您的客户端是.NET 3.5应用程序,而FooReportRecord位于.NET 4 wcf库中,则会出现编译时错误

将FooReportRecord移动到在.NET3.5中编译的第三类库中,并从WCF应用程序和客户端(ASP.NET)引用它

但是正如@Phil所提到的,为什么不返回FooReportRecord[]而不是byte[]

服务

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

    // get data based on fooName and populate data

    return data.ToArray();
}

为什么返回byte[]而不是fooreptrecord?当您说“我的ASP.NET应用程序正在3.5上运行”时,您的WCF服务是否托管在ASP.NET网站上?或者ASP.NET应用程序是客户端?我猜你的意思是,字节[]试图尽可能多地压缩对象列表。当我进行测试时,使用字节数组与实际列表相比,我可以得到更多的结果。在看了一整天之后,我最终放弃了将reporting service升级到4.0的全部理由。我返回的列表太大,无法尝试一些黑客的跨版本反序列化。直到我看到“为什么字节[]”,我才开始问自己同样的问题。谢谢你的帮助!