Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.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#Can';t反序列化数据表_C#_Datatable_Deserialization_Assembly Resolution_Binary Deserialization - Fatal编程技术网

C#Can';t反序列化数据表

C#Can';t反序列化数据表,c#,datatable,deserialization,assembly-resolution,binary-deserialization,C#,Datatable,Deserialization,Assembly Resolution,Binary Deserialization,我有一个客户机/服务器项目,我正试图通过套接字将一个数据表(从TableAdapter中提取)从服务器发送到客户机。 我的服务器名称空间是srvCentral,我的客户端是appClient。 当我尝试在客户机中反序列化DataTable时,它会抛出一个序列化异常: 找不到程序集“srvCentral,版本=1.0.0.0,区域性=中立,PublicKeyToken=null” 我在谷歌上搜索并尝试过一些事情,比如控制AssemblyResolve,使svchost挂起并强制关闭,以及使用如下活

我有一个客户机/服务器项目,我正试图通过套接字将一个数据表(从TableAdapter中提取)从服务器发送到客户机。 我的服务器名称空间是srvCentral,我的客户端是appClient。 当我尝试在客户机中反序列化DataTable时,它会抛出一个序列化异常: 找不到程序集“srvCentral,版本=1.0.0.0,区域性=中立,PublicKeyToken=null” 我在谷歌上搜索并尝试过一些事情,比如控制AssemblyResolve,使svchost挂起并强制关闭,以及使用如下活页夹:

sealed class AllowAllAssemblyVersionsDeserializationBinder : SerializationBinder
{
    public override Type BindToType(string assemblyName, string typeName)
    {
        Type typeToDeserialize = null;

        String currentAssembly = Assembly.GetExecutingAssembly().FullName;

        // In this case we are always using the current assembly
        assemblyName = currentAssembly;

        // Get the type using the typeName and assemblyName
        typeToDeserialize = Type.GetType(String.Format("{0}, {1}",
                                         typeName, assemblyName));

        return typeToDeserialize;
    }
}
例外仍然存在。。。 数据表在任何地方都可以反序列化,不是吗? 我做错了什么

我的序列化代码是:

public byte[] Serializar(Object item)
{
    BinaryFormatter formatter = new BinaryFormatter();
    MemoryStream ms = new MemoryStream();
    formatter.Serialize(ms, item);
    return ms.ToArray();
}

public Object Deserializar(byte[] buffer)
{
    BinaryFormatter formatter = new BinaryFormatter();
    MemoryStream ms = new MemoryStream(buffer);

    formatter.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;

    formatter.Binder = new AllowAllAssemblyVersionsDeserializationBinder();

    Object a = formatter.Deserialize(ms);

    return a;
}

sealed class AllowAllAssemblyVersionsDeserializationBinder : SerializationBinder
{
    public override Type BindToType(string assemblyName, string typeName)
    {
        Type typeToDeserialize = null;

        String currentAssembly = Assembly.GetExecutingAssembly().FullName;

        // In this case we are always using the current assembly
        assemblyName = currentAssembly;

        // Get the type using the typeName and assemblyName
        typeToDeserialize = Type.GetType(String.Format("{0}, {1}",
                                         typeName, assemblyName));

        return typeToDeserialize;
    }
}
经过一番挖掘,我已经解决了这个问题

这不是解决问题的更好方法,但却是避免问题的简单方法。对于小事情,这就足够了。若要从表中检索数据以仅显示内容,请使用此选项

namespace YourLibrary
{
[Serializable]
public class Tabela: ISerializable
{
    protected ArrayList colNames;
    protected ArrayList colTypes;
    protected ArrayList dataRows;

    public Tabela()
    {

    }

    public Tabela (DataTable dt)
    {
        colNames = new ArrayList();
        colTypes = new ArrayList();
        dataRows = new ArrayList();
        // Insert column information (names and types)
        foreach(DataColumn col in dt.Columns)
        {
            colNames.Add(col.ColumnName); 
            colTypes.Add(col.DataType.FullName);   
        }

        // Insert rows information
        foreach(DataRow row in dt.Rows)
            dataRows.Add(row.ItemArray);
    }

    public Tabela(SerializationInfo info, StreamingContext context)
    {
        colNames = (ArrayList)info.GetValue("colNames",typeof(ArrayList));
        colTypes = (ArrayList)info.GetValue("colTypes",typeof(ArrayList));
        dataRows = (ArrayList)info.GetValue("dataRows",typeof(ArrayList));

    }

    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("colNames", colNames);
        info.AddValue("colTypes", colTypes);
        info.AddValue("dataRows", dataRows);
    }

    public DataTable GenerateDataTable()
    {
        DataTable dt = new DataTable();

        // Add columns
        for(int i=0; i<colNames.Count; i++)
        {
            DataColumn col = new DataColumn(colNames[i].ToString(), 
                Type.GetType(colTypes[i].ToString() ));     
            dt.Columns.Add(col);
        }

        // Add rows
        for(int i=0; i<dataRows.Count; i++)
        {
            DataRow row = dt.NewRow();
            row.ItemArray = (object[]) dataRows[i];
            dt.Rows.Add(row);
        }

        dt.AcceptChanges();
        return dt;
    }
}
}
名称空间库
{
[可序列化]
公共类选项卡:ISerializable
{
受保护的ArrayList colname;
受保护的ArrayList列类型;
受保护的ArrayList数据行;
公共标签()
{
}
公共选项卡(数据表dt)
{
colNames=newarraylist();
colTypes=newarraylist();
dataRows=newarraylist();
//插入列信息(名称和类型)
foreach(dt.列中的数据列列列)
{
colNames.Add(col.ColumnName);
添加(col.DataType.FullName);
}
//插入行信息
foreach(数据行中的数据行)
添加(row.ItemArray);
}
公共选项卡(SerializationInfo、StreamingContext上下文)
{
colNames=(ArrayList)info.GetValue(“colNames”,typeof(ArrayList));
colTypes=(ArrayList)info.GetValue(“colTypes”,typeof(ArrayList));
dataRows=(ArrayList)info.GetValue(“dataRows”,typeof(ArrayList));
}
void ISerializable.GetObjectData(SerializationInfo信息,StreamingContext上下文)
{
info.AddValue(“colNames”,colNames);
info.AddValue(“colTypes”,colTypes);
info.AddValue(“数据行”,数据行);
}
公共数据表GenerateDataTable()
{
DataTable dt=新的DataTable();
//添加列
对于(int i=0;i
我做错了什么

叹息;1:使用
数据表
,2:使用
二进制格式化程序

让我们先看后一个;
BinaryFormatter
是一个以类型为中心的序列化程序。实际上,如果您只是使用
DataTable
而不是一个类型化的
DataTable
子类,那么您很可能已经摆脱了这个问题,但是
BinaryFormatter
最终希望在每一端都有相同的类型。并且你没有这个。即使你做到了,每次你对管道的一端进行版本转换时,事情可能会变得有点…不可靠(除非你在这方面投入额外的精力)

作为临时修复,对于这一步,只需使用
DataTable
而不是键入的
DataTable
子类,它可能会工作

然而,
DataTable
也是一件很难处理的事情——相当笨拙,而且用途非常广泛然后……可能是推送,但在大多数情况下,使用基本的POCO/DTO模型会更好。这也更容易在客户机/服务器边界上表达,包括大多数IPC工具。例如,以下POCO/DTO类(或它们的列表)非常友好:

public class Order {
    public int OrderID {get;set;}
    public string Reference {get;set;}
    ...
}

就个人而言,我强烈建议您考虑切换到一个更简单、基于类的模型,使用一个对特定类型不挑剔的序列化程序;
XmlSerializer
JavascriptSerializer
工作得很好。如果您需要小而高效的数据,那么protobuf-net也值得一看。所有这些都在socket上工作得很好s、 也一样。

@taras.roshko可能比我通常建议的要强烈一点,但我并不反对;pDatatables不是一个坏的数据结构:它们在表格数据方面非常好,而且使用表格数据比poco列表快得多,因为它们的内部结构是一个对象列表[]。任何东西都有它的用途:如果想要表格数据,例如带有可选视图和过滤器的数据表,则数据表是一个可靠的选择。忽略这一点是愚蠢的。如果数据的用途是对象列表,则数据表确实是一个愚蠢的选择(因为它是关于表格数据的)。然而,在所有情况下都将其注销是一种短视行为。答案很好,马克,出于好奇……通过界面暴露对象是否可以解决版本问题?@DoctaJonez否;重要的是对象是什么,而不是它的外观like@Frans我强烈反驳()一个
DataTable
要“快得多”-加载它们需要与POCO相同的时间。是的,
DataTable
有很多功能(投影、过滤器等),但(例如)LINQ到对象(至少是单向的)也有很多功能。别忘了,这里的上下文是数据通信,而不是用户界面。当然,
DataTable
确实有一些用途……只是,除非/直到开发人员能够清楚地说明选择
DataTable
的原因,否则可能会有更合适(更简单)的方法备选方案。感谢大家的帮助。Marc感谢解释,我已经解决了它,创建了一个ghost table类并将其放在dll上。我传递数据只是为了输出它或执行select然后输出,所以我认为这种方法已经足够了。我将看看什么是POCO或DTO模型。