我正在使用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对象,或者是否有其他方法可以执行此类操作。
答案 0 :(得分:0)
从Writing to then reading from a MemoryStream我提取一些你应该遵循的步骤:
sw.Write(objBrowserTest);
memStream.Position = 0;
重置流的位置。ReadToEnd()
方法读取流的所有字节。不要使用GetBuffer()
,它不会获取流的内容,它会占用缓冲流的缓冲区。
如果你想要系列化和对象,你有2个类来做DataContractSerializer
(DCS)和BinaryFormatter
(BF)。
如果要序列化为byte[]
,可以使用DCS“WriteObtect”或BF“Serialize”。两种方法都使用流(您的内存流)和对象。
要从中反序列化已存储的byte[]
,您可以使用DCS ReadObject
和BF Deserialize
(转换为类)。两个方法参数都是要读取的Stream。
memStream.ToArray()
让byte[]
存储它。使用带有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