Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NETC#DocX库:如何序列化DocX文档?_C#_.net_Serialization_Novacode Docx - Fatal编程技术网

.NETC#DocX库:如何序列化DocX文档?

.NETC#DocX库:如何序列化DocX文档?,c#,.net,serialization,novacode-docx,C#,.net,Serialization,Novacode Docx,当使用DocX库时,我在服务器上生成DocX文档,然后下载它 为此,我需要将文档转换为字节数组 为此,我以前将文档保存为物理文件,如下所示: // Save all changes to this document. document.SaveAs(GENERATED_DOCX_LOCATION); return System.IO.File.ReadAllBytes(GENERATED_DOCX_LOCATION); 但我宁愿不那样做。是否可以序列化此对象以下载它而不进行物理保存 我已经试

当使用DocX库时,我在服务器上生成DocX文档,然后下载它

为此,我需要将文档转换为字节数组

为此,我以前将文档保存为物理文件,如下所示:

// Save all changes to this document.
document.SaveAs(GENERATED_DOCX_LOCATION);

return System.IO.File.ReadAllBytes(GENERATED_DOCX_LOCATION);
但我宁愿不那样做。是否可以序列化此对象以下载它而不进行物理保存

我已经试过了:

private 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();
    }
}
与:

return this.ObjectToByteArray(document);
但显然,DocX没有实现ISerializable

编辑:下面的代码也不起作用

byte[] byteArray = null;
using (var stream = new MemoryStream())
{
    document.SaveAs(stream);
    byteArray = stream.ToArray();
}
return byteArray;

试试这个,替换我的c:\temp。。。路径和文档位置,这将从字节数组中获取并写入文件

void Main()
{
    byte[] bytes = System.IO.File.ReadAllBytes(@"C:\temp\test.csv");

    using (var bw = new BinaryWriter(File.Open(@"C:\temp\test2.csv", FileMode.OpenOrCreate)))
    {
        bw.Write(bytes);
        bw.Flush();
    }

}

没有办法通过原始的DocX库来实现这一点

这是一个遗憾,因为这个库使用MemoryStream来处理数据

为了解决我的问题,我只添加了一个新的公共只读属性来公开私有MemoryStream变量,然后使用以下简单代码:

在DocX项目中添加的代码:

public MemoryStream DocumentMemoryStream { get { return this.memoryStream; }  } 
我的主要功能中的代码:

return document.DocumentMemoryStream.ToArray();

这是一个web服务器,是您组织的内部服务器吗?是的,它是一个私有服务器,由一个专门的团队管理。看看这个,这应该能满足您的需要(除非您使用MVC,这将是一个不同的答案,但如果您需要,我可以稍后为您编写一个),但是。。。实际上,这应该可以工作,它不是HTTP服务器。对不起,我应该说得更清楚些。这是一个Windows服务(WCF应用程序),它使用二进制管道传输数据。所以我不认为你的链接可以在这里应用(但我把它保留在收藏夹中,因为我们计划在几个月后在SOAP中迁移)好的,让我试试我这边的一些事情,我会回来谢谢你的考虑,但我不想把文件test2.csv保存在磁盘上。我通过改变DocX库找到了摆脱这种状况的方法,更多细节请参见我的帖子。谢谢这只是一个例子,说明了你可以做你需要做的事情,你不必保存csv文件这不是我需要做的,因为你从一个物理文件的字节[]开始,我有一个DocX开始,在内存中,而不是在磁盘上。