我只需要进行this question中公开的反向转换。
我有一个MemoryStream,并希望将它存储在我的SQL CE数据库的System.Data.Linq二进制字段中(仅供参考我使用的是EF代码)。
MemoryStream实际上是一个XML,它大于String字段的最大大小,所以除了将它存储在二进制文件中之外我没有别的办法(关于这个主题的建议真的很感激)。
我的代码(改编)
private Stream _userLayout;
_userLayout = new MemoryStream();
DXGridControl_Table.SaveLayoutToStream(_userLayout);
MyDatabse.SomeTable.SomeBinaryField = _userLayout.????
答案 0 :(得分:4)
MemorySteam
类有ToArray()
方法:
将流内容写入字节数组,而不管Position属性。
此方法返回MemoryStream内容的副本作为字节数组。如果当前实例是在提供的字节数组上构造的,则返回此实例有权访问的数组部分的副本。有关详细信息,请参阅MemoryStream构造函数。
当MemoryStream关闭时,此方法有效。
使用byte[]
,您可以轻松获得Binary
个实例,因为Byte[]
to Binary
implicit conversion可用:
MyDatabse.SomeTable.SomeBinaryField = (Binary) _userLayout.ToArray();
答案 1 :(得分:3)
首先是
byte[] buffer = new byte[LENGTH];
MemoryStream memoryStream = new MemoryStream(buffer);
在您的示例中,您可以使用
DXGridControl_Table.SaveLayoutToStream(_userLayout);
byte[] doSomethingwithyourData = _userLayout.GetBuffer();
var length = _userLayout.Length;
使用该信息,您可以将二进制数据写入任何内容。
请注意,缓冲区包含可能未使用的已分配字节。 例如,如果字符串“test”被写入MemoryStream 对象,从GetBuffer返回的缓冲区的长度是256,而不是 4,未使用252字节。要仅获取缓冲区中的数据,请使用 ToArray方法;但是,ToArray会在其中创建数据的副本 存储器中。
或者
Binary binary = new Binary(_userLayout.ToArray());
就像在另一个答案中说的那样,二元上有一个隐式转换:
public static implicit operator Binary(byte[] value) {
return new Binary(value);
}
您请求了示例。 关于用法的一个小例子:
namespace Stackoverflow.Hannish.SaveLayout
{
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Windows.Forms;
public partial class Form1 : Form
{
/// <summary>
/// Here we store the layout data as a string. This is the data, that
/// gets saved to disk / database / etc.
/// </summary>
private string layoutdata = string.Empty;
public Form1()
{
this.InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// Just some FooBar data.
var data = new List<DataValue>
{
new DataValue { Id = 1, Name = "Xyz", IsCool = true },
new DataValue { Id = 2, Name = "Abc", IsCool = false }
};
this.gridControl1.DataSource = data;
}
private void bnLoadLayout_Click(object sender, EventArgs e)
{
using (var stream = new MemoryStream())
{
var strdata = Encoding.Default.GetBytes(this.layoutdata);
stream.Write(strdata, 0, strdata.Length);
stream.Seek(0, SeekOrigin.Begin);
this.gridView1.RestoreLayoutFromStream(stream);
}
}
private void bnSaveLayout_Click(object sender, EventArgs e)
{
using (var stream = new MemoryStream())
{
this.gridView1.SaveLayoutToStream(stream);
this.layoutdata = Encoding.Default.GetString(stream.ToArray());
}
}
}
}
还有一些字节魔术:
private void bnLoadBinLayout_Click(object sender, EventArgs e)
{
using (FileStream fstream = File.Open("Layoutdata.bin", FileMode.Open))
{
int length = (int)fstream.Length;
byte[] buffer = new byte[length];
fstream.Read(buffer, 0, length);
var memstream = new MemoryStream(buffer);
this.gridView1.RestoreLayoutFromStream(memstream);
}
}
private void bnSaveBinLayout_Click(object sender, EventArgs e)
{
using (FileStream fstream = File.Create("Layoutdata.bin"))
{
var memstream = new MemoryStream();
this.gridView1.SaveLayoutToStream(memstream);
fstream.Write(memstream.GetBuffer(), 0, (int)memstream.Length);
}
}
......就像例子一样。 DevExpress GridView可以使用SaveLayoutToXml();
保存布局答案 2 :(得分:1)
关于你的第二个问题以及你(可能)来回转换数据的概念错误。
将有趣的DevExpress XML保存在ntext数据列中。
ntext:可变长度Unicode数据,最大长度为(2 ^ 30-2)/ 2(536,870,911)个字符。存储大小(以字节为单位)是输入字符数的两倍。