将对象转换为ByteArray后,对象大小发生了更改

本文关键字:对象 发生了 转换 ByteArray | 更新日期: 2024-10-20 16:34:04

我有一个方法可以将对象转换为byte[],以便在浏览器中填充PDF。我可以完美地看到内联PDF,但如果我点击"保存"按钮并从本地打开下载的文件,它会给我以下消息:

"Adobe Reader无法打开xx.pdf,因为它不是受支持的文件类型,或者因为文件已损坏(例如,它是作为电子邮件附件发送的,没有正确解码)"

我发现数据类型转换过程中的数据大小差异可能会导致此问题。从数据库中提取的pdfDataObject的大小为{byte[1111161]},与存储到数据库之前相同;转换后的pdfdata为{byte[1111189]},在转换过程中增加了28个字节。

数据库中pdf的数据类型为varbinary(max)

public byte[] populated_PDF(string args)
{
    DataTable dt = new DataTable();
    //sqlconnection to get data
    var pdfDataObject = dt.Rows[0]["PDF_DATA"];   
    // get the Varbinary datatype from database
    // The Data Size of pdfDataObject is {byte[1111161]}
    byte[] pdfdata = ObjectToByteArray(pdfDataObject);
    // The Data Size of pdfdata is       {byte[1111189]}
    return pdfdata;
}

对象到ByteArray方法

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

PDF可以在浏览器中以两种大小的数据显示。但是,如果在数据大小为{byte[1111161]}的数据可以打开的地方应用"保存",则无法从本地打开数据大小为{byte[1111111189]}的数据。

ObjectToByteArray方法似乎添加了一些内容,导致在转换过程中无法打开本地下载的PDF。

不知道怎么解决。有什么想法吗?

将对象转换为ByteArray后,对象大小发生了更改

您正在通过.NET特定的序列化程序(BinaryFormatter)传递PDF字节。。。这样的操作改变结果并不奇怪,因为它在PDF的顶部添加了一个序列化层。剥去它。

这应该做得很好:

return (byte[])dt.Rows[0]["PDF_DATA"];
相关文章: