c# - 如何将字节[]转换为c#中的数据表?
问题描述
我在我的报告应用程序中使用 tableau server 进行报告,并且我在 tableau server 上创建了报告文件,它工作正常。我需要通过邮件将这些报告文件发送给用户。我已使用以下代码将报告导出到字节 []
var client = new RestSharp.RestClient(repartPath);
var request = new RestRequest(Method.GET);
request.AddHeader("cache-control", "no-cache");
request.AddHeader("Connection", "keep-alive");
request.AddHeader("Accept-Encoding", "gzip, deflate");
request.AddHeader("Host", hostname);
request.AddHeader("Postman-Token", tokenValue);
request.AddHeader("Cache-Control", "no-cache");
request.AddHeader("Accept", "*/*");
request.AddHeader("User-Agent", "PostmanRuntime/7.19.0");
request.AddHeader("X-Tableau-Auth", tableauToken);
IRestResponse response = client.Execute(request);
if (response.IsSuccessful)
{
return response.RawBytes;
}
上面的代码返回字节 []。现在我想将字节 [] 转换为数据表,将字节 [] 转换为数据表。我正在使用以下代码:
using (MemoryStream stream = new MemoryStream(byteArrayData))
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
_dataTable= (DataTable)binaryFormatter.Deserialize(stream);
}
但它抛出异常:输入字符串不是有效的二进制格式。任何帮助将不胜感激,非常感谢提前。
解决方案
序列化数据时,序列化和反序列化方法必须匹配。您展示了一些发出请求的代码,但它不包括实际执行序列化的代码。所以最可能的答案是 BinaryFormatter 没有用于序列化数据。
但是,binaryFormatter 可能不是序列化程序的正确选择。这或多或少采用了数据在内存中的表示方式,并将其放入数据流中。值得注意的是,它可能会因更改 .Net 版本而中断,但它还有许多其他问题。
如果字节数组表示文件,则应将字节数组转换为流并将流提供给任何可以读取文件的库。或者,如果这不可能,将字节数组保存到一个临时文件中,并要求库打开该文件。
如果您想自己进行序列化,您通常会创建一个适合序列化的新类型,将数据转换为该类型,然后使用一些序列化库对其进行序列化。Json.Net和Protobuf.Net是相当流行的序列化库,但还有更多。
推荐阅读
- ios - iOS 中的语义问题
- konvajs - 当我使用 Konva.Text 时,如何在文本形状中添加 html 标签“sup”和“sub”?
- c# - 如何获取列表列表中的第一个索引
- python - 如何删除两个特定的字符
- xcode - 找不到 iPhone 6(或任何其他)模拟器 React-Native,没有什么帮助?
- ios - 未找到“GeneratedDotEnv.m”文件
- android - 有什么方法可以检测到应用程序崩溃然后在 Android 中再次启动它?
- selenium - 如何消除 Xpath 的使用?
- python - 如何使用代理字典中的随机代理向 url 发送 get 请求?
- r - 在每个服务的代码周围加上引号的快速方法