C# 序列化 - 找不到程序集
C# Serialization - Could not find the assembly
我正在从事 C# TCP 服务器-客户端编程。我的问题很简单,但不知何故我无法弄清楚。
我有一个对象,我想将该对象序列化,通过套接字发送并反序列化客户端。但问题在于反序列化。我用 binaryformatter 序列化对象。实际上我得到了我应该得到的实际字节数组。但是在反序列化时不知何故我得到
System.Runtime.Serialization.SerializationException: 'Multi Server,
Version=1.0.0.0, Culture=neutural, PublicTokenKey=Null' assembly could
not found.
当我在序列化后尝试在服务器端反序列化时没有问题。
我尝试自定义活页夹,但也不起作用。如果有人可以帮助我,我真的很感激。
如果我没猜错的话,您有 2 个项目 - "Multi Client" 和 "Multi Server"。
您序列化 "Multi Server" 中定义的对象,然后您在 "Multi Client" 中拥有该 class 的副本。
所以你序列化一个对象 "MultiServer.SomeClass" 然后你想把它变成 "MultiClient.SomeClass"。这行不通的。
您需要创建一个 common dll 项目(我们将其命名为 "MultiCommon",您将在其中放置 class,并通过 "MultiServer" 和 "MultiClient"。这样,您将序列化和反序列化的不是 "MultiServer.SomeClass",而是 "MultiCommon.SomeClass"。
听起来您正在使用 BinaryFormatter
,在这种情况下,坦率地说,我认为最有价值的建议是:不要那样做。 BinaryFormatter
的数据格式从根本上与您的确切实现细节相关联,因此很难:在不同的端使用不同的代码(意思是:部署非常困难和脆弱 - 到处都需要更改 同时), or b: 随着时间的推移修改实现。
坦率地说,我强烈建议您寻找其他序列化工具。我有很大的偏见,但是 protobuf-net 对于这种情况 非常 有效;它仍然是 "binary"(意思是:不是文本),但它与内部实现细节无关。它快速(通常比 BinaryFormatter
快得多)、高效(通常比 BinaryFormatter
需要的带宽少得多)、免费,并且通常很容易应用于现有的对象模型;它通常意味着从这里开始:
[Serializable]
public class Custom {
public int Id {get;set;}
public string Name {get;set;}
// ...etc
}
对此:
[ProtoContract] // you can keep the [Serializable] for compat if you want
public class Custom {
[ProtoMember(1)]
public int Id {get;set;}
[ProtoMember(2)]
public string Name {get;set;}
// ...etc
}
我正在从事 C# TCP 服务器-客户端编程。我的问题很简单,但不知何故我无法弄清楚。
我有一个对象,我想将该对象序列化,通过套接字发送并反序列化客户端。但问题在于反序列化。我用 binaryformatter 序列化对象。实际上我得到了我应该得到的实际字节数组。但是在反序列化时不知何故我得到
System.Runtime.Serialization.SerializationException: 'Multi Server, Version=1.0.0.0, Culture=neutural, PublicTokenKey=Null' assembly could not found.
当我在序列化后尝试在服务器端反序列化时没有问题。
我尝试自定义活页夹,但也不起作用。如果有人可以帮助我,我真的很感激。
如果我没猜错的话,您有 2 个项目 - "Multi Client" 和 "Multi Server"。 您序列化 "Multi Server" 中定义的对象,然后您在 "Multi Client" 中拥有该 class 的副本。
所以你序列化一个对象 "MultiServer.SomeClass" 然后你想把它变成 "MultiClient.SomeClass"。这行不通的。
您需要创建一个 common dll 项目(我们将其命名为 "MultiCommon",您将在其中放置 class,并通过 "MultiServer" 和 "MultiClient"。这样,您将序列化和反序列化的不是 "MultiServer.SomeClass",而是 "MultiCommon.SomeClass"。
听起来您正在使用 BinaryFormatter
,在这种情况下,坦率地说,我认为最有价值的建议是:不要那样做。 BinaryFormatter
的数据格式从根本上与您的确切实现细节相关联,因此很难:在不同的端使用不同的代码(意思是:部署非常困难和脆弱 - 到处都需要更改 同时), or b: 随着时间的推移修改实现。
坦率地说,我强烈建议您寻找其他序列化工具。我有很大的偏见,但是 protobuf-net 对于这种情况 非常 有效;它仍然是 "binary"(意思是:不是文本),但它与内部实现细节无关。它快速(通常比 BinaryFormatter
快得多)、高效(通常比 BinaryFormatter
需要的带宽少得多)、免费,并且通常很容易应用于现有的对象模型;它通常意味着从这里开始:
[Serializable]
public class Custom {
public int Id {get;set;}
public string Name {get;set;}
// ...etc
}
对此:
[ProtoContract] // you can keep the [Serializable] for compat if you want
public class Custom {
[ProtoMember(1)]
public int Id {get;set;}
[ProtoMember(2)]
public string Name {get;set;}
// ...etc
}