我正在编写一个原型TCP连接,我在同质化要发送的数据时遇到了一些问题.

目前,我只发送字符串,但在future ,我们希望能够发送任何对象.

目前代码非常简单,因为我认为所有内容都可以转换为字节数组:

void SendData(object headerObject, object bodyObject)
{
  byte[] header = (byte[])headerObject;  //strings at runtime, 
  byte[] body = (byte[])bodyObject;      //invalid cast exception

  // Unable to cast object of type 'System.String' to type 'System.Byte[]'.
  ...
}

这当然很容易用简单的方法解决

if( state.headerObject is System.String ){...}

问题是,如果我这样做,我需要判断在运行时无法转换为字节[]的每种类型的对象.

因为我不知道在运行时不能转换成字节[]的每个对象,所以这真的不是一个选项.

在C#中,如何将任何对象转换为字节array.NET 4.0?

推荐答案

使用BinaryFormatter:

byte[] ObjectToByteArray(object obj)
{
    if(obj == null)
        return null;
    BinaryFormatter bf = new BinaryFormatter();
    using (MemoryStream ms = new MemoryStream())
    {
        bf.Serialize(ms, obj);
        return ms.ToArray();
    }
}

请注意,objobj中的任何属性/字段(以及它们的所有属性/字段)都需要用Serializable attribute标记,才能成功地用Serializable attribute序列化.

.net相关问答推荐

.NET restore/build在使用组织包的Github Action工作流中调用时获得401

我的Azure应用服务从哪里获取应用设置?

.NET 中两个子字符串之间的非贪婪正则表达式匹配

如何在 Windows 窗体上显示 ClickOnce 版本号

Erlang 的让它崩溃的哲学 - 适用于其他地方吗?

SetupSet() 已过时.代替什么?

图像 UriSource 和数据绑定

.NET 4.0 中有内置的二叉搜索树吗?

我应该从 .NET 中的 Exception 或 ApplicationException 派生自定义异常吗?

如何在不丢失数据的情况下重命名 Entity Framework 5 Code First 迁移中的数据库列?

C# 相当于 Java 的 <?在泛型中扩展 Base>

创建多个线程并等待所有线程完成

如何允许程序集(单元测试)访问另一个程序集的内部属性?

如何对 LINQ to XML 中的元素进行深层复制?

如何从头开始以编程方式配置 log4net(无配置)

了解 C# 中的协变和逆变接口

在 WPF 中设置 Tab 键顺序

名称 <...> 不存在于命名空间 clr-namespace <...>

如何在 ASP.NET MVC 中重定向到动态登录 URL

嵌套捕获组如何在正则表达式中编号?