如何存储和检索Chromium Web Browser对象

时间:2016-03-28 06:00:22

标签: c# history cefsharp

我正在使用cefSharp开发一个应用程序,现在一切都很好我需要维护用户打开和关闭的所有浏览器标签的历史记录,并提供打开已关闭标签的选项。

有没有办法将Chromium Web Browser对象存储到内存或数据库中并从那里检索它。 我使用下面的代码将对象存储到数据库中

var objBrowserTest = (ChromiumWebBrowser)browserControl;

MemoryStream memStream = new MemoryStream();
StreamWriter sw = new StreamWriter(memStream);
sw.Write(objBrowserTest);

string sql = @"
INSERT INTO tblBrowserObj(cromObj)
VALUES(@VarBinary);
SELECT @@identity";

string connectionstring;
connectionstring = ConfigurationManager.ConnectionStrings[0].ConnectionString;
SqlConnection objConn = new SqlConnection(connectionstring);
if (objConn.State == ConnectionState.Open)
{
    objConn.Close();
}
objConn.Open();
SqlCommand sqlCmd = new SqlCommand(sql, objConn);
sqlCmd.Parameters.Add("@VarBinary", SqlDbType.VarBinary, Int32.MaxValue);
sqlCmd.Parameters["@VarBinary"].Value = memStream.GetBuffer();
string strID = sqlCmd.ExecuteScalar().ToString();
if (objConn.State == ConnectionState.Open)
{
    objConn.Close();
}    

表结构

CREATE TABLE [dbo].[tblBrowserObj](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [cromObj] [varbinary](max) NULL
) ON [PRIMARY]

我的问题是memStream.GetBuffer()始终显示byte[0]

任何人都可以告诉我如何从内存或数据库中存储和检索Chromium Web Browser对象,或者是否有其他方法可以执行此类操作。

1 个答案:

答案 0 :(得分:0)

1 - 从内存中读/写

Writing to then reading from a MemoryStream我提取一些你应该遵循的步骤:

  1. 不要忘记在sw.Write(objBrowserTest);
  2. 之后进行冲洗
  3. 在阅读之前,您必须使用memStream.Position = 0;重置流的位置。
  4. 使用 StreamWriter 包裹流,并使用ReadToEnd()方法读取流的所有字节。
  5. 不要使用GetBuffer(),它不会获取流的内容,它会占用缓冲流的缓冲区。

    2 - 从字节[]

    读取/写入对象

    如果你想要系列化和对象,你有2个类来做DataContractSerializer(DCS)和BinaryFormatter(BF)。

    2.1 - 序列化

    如果要序列化为byte[],可以使用DCS“WriteObtect”或BF“Serialize”。两种方法都使用流(您的内存流)和对象。

    2.2 - 反序列化

    要从中反序列化已存储的byte[],您可以使用DCS ReadObject和BF Deserialize(转换为类)。两个方法参数都是要读取的Stream。

    您需要做什么

    1. 使用一个
    2. 进行序列化
    3. 使用memStream.ToArray()byte[]存储它。
    4. 检索时,使用内存流写入数组
    5. 提示

      使用带有MemoryStream参数的byte[]构造函数,然后使用Position = 0

      此代码可能对您有所帮助:

      public byte[] ObjectToBytes(Object obj)
      {
          try
          {
              using (MemoryStream memStream = new MemoryStream())
              {
                  BinaryFormatter formatter = new BinaryFormatter();
                  formatter.Serialize(memStream, obj);
      
                  return memStream.ToArray();
              }
          }
          catch (Exception) { }  // do what you want
      
          return null;
      }
      
      public T BytesToObject<T>(byte[] array) where T : class
      {
          try
          {
              using (MemoryStream memStream = new MemoryStream(array) { Position = 0 })
              {
                  BinaryFormatter formatter = new BinaryFormatter();
                  T obj = formatter.Deserialize(memStream) as T;
      
                  return obj;
              }
          }
          catch (Exception) { }  // do what you want
      
          return null;
      }
      

      只需使用sqlCmd.Parameters["@VarBinary"].Value = ObjectToBytes(objBrowserTest );并在检索时使用BytesToObject<ChromiumWebBrowser>(bytes);

      来源

      http://www.digitalcoding.com/Code-Snippets/C-Sharp/C-Code-Snippet-Byte-array-to-object.html

      How deserialize Byte array to object - Windows 8 / WP 8

      https://msdn.microsoft.com/en-us/library/4abbf6k0(v=vs.110).aspx