我有一个外部web服务,它返回字节数组中的文件(小的,大的20Mb文件),它必须转换为base64字符串并包含在XML文件中
编码
我用来将字节数组转换为base64的代码是
Convert.ToBase64String(bytearray, 0, bytearray.Length, _
Base64FormattingOptions.InsertLineBreaks)
以下是我使用Linq to XML的实际xml构造。
attachment = From Item In cpd _
Select New XElement("attachment", _
New XAttribute("id", Item.UniqueID), _
New XElement("attachmentDocumentInformation", _
New XElement("actor", New XAttribute("reference", Item.AttchRefId)), _
New XElement("documentDescription", _
New XElement("documentTitle", Item.Document), _
New XElement("documentType", "A"), _
New XElement("sequence", Item.Sequence))), _
New XElement("documentContent", _
New XAttribute("contentEncoding", "base64"), _
New XAttribute("id", "DocumentContent" + Item.UniqueID), _
New XAttribute("mimeType", Item.mimeType), _
Convert.ToBase64String(Item.Content, 0, Item.Content.Length, _
Base64FormattingOptions.InsertLineBreaks)))
解码
我使用frombase64转换来获取收到的xml文件
Convert.FromBase64String(documentContentinBase64)
当文件较小时,它可以正常工作,当大文件转换返回“不支持此类接口”时。
我有两个问题:
由于
答案 0 :(得分:1)
这大致遵循您的文档,简单按摩一些名称,或添加xml序列化程序属性以获取所需的xml文档:
public class Document
{
public string Actor { get; set; }
public string Description { get; set; }
public string Title { get; set; }
public string type { get { return "A"; } }
public int Sequence { get; set; }
public byte[] Content { get; set; }
}
var d = new Document() { Actor = "Sean Connory", Description = "Thriller", Title = "The Rock" };
d.Content = new byte[] { 43,45,23,43,82,90,34 };
var xmls = new System.Xml.Serialization.XmlSerializer(typeof(Document));
using (var ms = new System.IO.MemoryStream())
{
xmls.Serialize(ms, d);
Console.Write(System.Text.Encoding.UTF8.GetString(ms.ToArray()));
}
Console.ReadLine();
XmlSerializer
会自动将byte[]
属性(在本例中为Content)转换为base64encoding。您正在寻找转换大文件并将其放入xml文档的“最佳”方法。他们是我的其他(更好)的方式。但是我过去曾以这种方式取得了很大的成功。如果设置正确,这个解决方案可以为您节省很多麻烦,因为它将为您构建xml文档,并在正确设置对象时将数据转换为Base64。在反面,您可以获取xml文档并使用其所有数据填充对象,这样可以节省导航xml节点以查找所需数据的时间。
<强>更新强>
如果这对大文件不起作用,我确实发现this MSDN article将流序列化为base64流。我以前从未使用过这个,所以不能为你提供任何有用的见解,但听起来更像你正在寻找的东西。