- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个序列化对象并通过网络发送它的程序:
TcpClient client = new TcpClient();
client.ReceiveTimeout = 10000;
client.SendTimeout = 10000;
IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888);
client.Connect(serverEndPoint);
BinaryFormatter binaryformatter = new BinaryFormatter();
NetworkStream networkStream = client.GetStream();
if (networkStream.CanWrite)
{
binaryformatter.Serialize(networkStream, kort);
}
另一方面,我接收并反序列化代码:
TcpClient tcpClient = (TcpClient)client;
tcpClient.SendTimeout = 10000;
tcpClient.ReceiveTimeout = 10000;
NetworkStream clientStream = tcpClient.GetStream();
try
{
if (clientStream.CanRead)
{
BinaryFormatter binaryformatter = new BinaryFormatter();
binaryformatter.Binder = new AllowAllAssemblyVersionsDeserializationBinder();
Kort tempkort = (Kort)binaryformatter.Deserialize(clientStream);
SetImage(tempkort);
}
}
catch (SerializationException e)
{
MessageBox.Show("Failed to deserialize. Reason: " + e.Message);
throw;
}
finally
{
clientStream.Close();
tcpClient.Close();
}
但是当我反序列化时,我得到了关于程序集丢失的错误:
"An unhandled exception of type
System.Runtime.Serialization.SerializationException
occurred in Server.exe Additional information: Unable to find assembly 'Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
我用这个解决了:
sealed class AllowAllAssemblyVersionsDeserializationBinder : SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
String currentAssembly = Assembly.GetExecutingAssembly().FullName;
// In this case we are always using the current assembly
typeName = "Server.Kort";
assemblyName = currentAssembly;
// Get the type using the typeName and assemblyName
Type typeToDeserialize = Type.GetType(String.Format("{0}, {1}",
typeName, assemblyName));
return typeToDeserialize;
}
}
但现在我尝试这样做时,我不断收到一条错误消息:
"Object of type
Server.Kort
cannot be converted to typeServer.Kort+kortvalör
."
而且我不知道如何修复它。
最佳答案
类(class)Kort
在发送方必须包含一个名为 enum
的嵌套类型实例(可能是 kortvalör
?) .而且,自 BinaryFormatter
序列化公共(public)和私有(private)字段而不是属性,嵌套类型可能对外界完全不可见,但仍会被序列化。
例如,我能够重现您的异常 "Object of type Server.Kort cannot be converted to type Server.Kort+kortvalör"
将您的 Binder 与以下类一起使用:
[Serializable]
public class Kort
{
// Private enum that is invisible to the outside world.
enum kortvalör
{
Zero,
One,
Two,
Three
}
kortvalör valör = kortvalör.Three;
public int Value
{
get
{
return (int)valör;
}
set
{
// Check to make sure the incoming value is in a valid range.
var newvalör = (kortvalör)value;
if (Enum.IsDefined(typeof(kortvalör), newvalör))
valör = newvalör;
else
valör = default(kortvalör);
}
}
}
当反序列化上面的类时,您的绑定(bind)器将被调用两次,一次是使用 typeName
对于 Kort
-- 然后一次使用类型名称 "MyClientNamespace.Kort+kortvalör"
.由于您的 Binder 忽略传入的 typeName
并返回 typeof(Kort)
, 这失败了。
您有几个选项可以解决这个问题:
提取你的类 Kort
到共享 DLL 中并将其与发送和接收应用程序链接。然后问题就消失了。
为 Kort
引用的所有类型创建副本在发送和接收应用程序中——包括私有(private)嵌套类型——并在你的 SerializationBinder
的更智能版本中适本地重新映射类型名称。 .文章Advanced Binary Serialization: Deserializing an Object Into a Different Type Than the One It was Serialized Into有一个如何做的例子。
考虑使用不同的序列化格式来序列化属性,而不是私有(private)字段。 BSON是一种选择。 Protobuf-net是另一个。
关于c# - 使用 binaryformatter 反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30196506/
在 .NET5 之前,我们通过以下代码序列化/反序列化字节/对象: private static byte[] StructToBytes(T t) { using (
BinaryFormatter 序列化的 128³ 数组加倍,占用 50 MB 空间。序列化具有两个双字段的 128³ 结构数组需要 150 MB 和超过 20 秒的处理时间。 是否有快速简单的替代方
我正在购买 BinaryFormatter 替代品/替代品。 我对 BinaryFormatter 的当前问题(以及替代方案应该解决这个问题)是 1) 向后兼容(可以反序列化使用早期版本序列化的类)
我想反序列化一个对象,但不知道前面的类。因此,请考虑以下代码... IFormatter formatter = new BinaryFormatter(); Stream stream = new
在我的对象图中,我有类似的东西 [Serializable] public class Dog { string _name; } 我有各种狗的列表和对狗的引用。 由于 Dog 在软件创建之
背景 我有一个对象需要序列化以便传输到高性能计算集群供以后使用 以前,我为我的对象使用了开箱即用的二进制格式化程序,它代表了一个统计形状模型并且一切顺利 我的对象变得更加复杂,我决定通过实现 ISer
我有一个使用 BinaryFormatter 序列化数据的应用程序。一个成员被添加到从一个版本序列化到下一个版本的类中,而不更改类名。添加了代码以处理旧序列化文件中可能缺少添加成员的情况: priva
我正在创建跨平台应用程序。我正在尝试反序列化 android 中的文件。在 Windows 中一切正常。这是我的代码: [Serializable] //serializacja potrzebna
BinaryFormatter 在我的代码中表现得很奇怪。我有如下代码 [Serializable] public class LogEntry { private int id
我有以下方法来生成对象的散列。它工作得很好!但是,当我更改程序集的版本时,即使对象相同,哈希也会发生变化。 public static string GetHash(Object item) {
我目前正在尝试与首先使用 C# 的 BinaryFormatter 格式化后通过网络发送数据的程序进行互操作。这是一个愚蠢的想法,我讨厌它,但我必须与之互操作。 我知道字体是什么样的,我知道它的确切布
我们使用 BinaryFormatter 将对象序列化为 NetworkStream 并通过 TCP 套接字传输它们。 我只是想弄清楚 Endiannes 是固定的还是依赖于系统。 我知道 Binar
引用 this回答一个问题。 这可以重写为: private static BinaryFormatter formatter = new BinaryFormatter(); pub
我正在开发自己的远程桌面 C# 程序。我想知道我是否可以使用 BinaryFormatter 序列化我自己的对象例如包含 BitMap 屏幕截图、鼠标坐标和一些文本属性的“数据包”。然后客户端将反序列
我有以下方法来生成对象的散列。它工作得很好!但是,当我更改程序集的版本时,即使对象相同,哈希也会发生变化。 public static string GetHash(Object item) {
我面临着一个我无法识别的非常棘手的问题。 我正在运行一个非常大的商业 ASP.Net 应用程序,其中包含数千个对象;它使用内存中的序列化/反序列化和 MemoryStream 来克隆应用程序的状态(保
当 .NET 的 BinaryFormatter用于序列化对象图,是否应用了任何类型的压缩? 我在上下文中询问我是否应该担心对象图有很多重复的字符串和整数。 编辑 - 稍等,如果字符串在 .NET 中
我正在尝试将对象图从服务器进程移动到客户端。它有效。至少当客户端和服务器都在我的开发虚拟机上时它可以工作。当我在我的基础机器(dev vm 上的客户端)上运行服务器时,它也可以工作。 不过,当我在我的
Protobuf-net 中 AsReference 选项的存在以及 BinaryFormatter 是“图形序列化器”的说法让我假设 BinaryFormatter 不维护引用并且它会复制每个对象。
最近,我们将一部分代码移到了不同的项目库中。 不幸的是,这些数据似乎已使用 BinaryFormatter 序列化到数据库中(不要问我为什么,我不知道,我讨厌这个想法)。 现在我负责创建一个更新数
我是一名优秀的程序员,十分优秀!