我只需要进行this question中公开的反向转换。

我有一个MemoryStream,并想将其存储在我的SQL CE数据库的System.Data.Linq Binary字段中(仅供参考,我首先使用EF代码)。

MemoryStream实际上是XML,它大于String字段的最大大小,因此我发现没有其他方法可以将其存储在Binary中(对此主题的建议非常感谢)。

我的代码(适应)

   private Stream _userLayout;
   _userLayout = new MemoryStream();
   DXGridControl_Table.SaveLayoutToStream(_userLayout);
   MyDatabse.SomeTable.SomeBinaryField = _userLayout.????

最佳答案

首先有

        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()保存布局本身。

关于c# - 如何将内存流转换为System.Data.Linq.Binary?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15718122/

10-13 03:23