如何将Memory Stream转换为System.Data.Linq.Binary?

时间:2013-03-30 11:41:10

标签: c# stream binary sql-server-ce

我只需要进行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.????

3 个答案:

答案 0 :(得分:4)

MemorySteam类有ToArray()方法:

MemoryStream.ToArray Method

  

将流内容写入字节数组,而不管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)个字符。存储大小(以字节为单位)是输入字符数的两倍。

请参阅SQL Server Compact 4.0 Data Types