gpt4 book ai didi

.NET:将对象从第 3 方程序集序列化为文件(以使 Selenium WebDriver 更快)

转载 作者:行者123 更新时间:2023-12-04 12:11:43 25 4
gpt4 key购买 nike

序列化 FirefoxDriver 的最终目标(我的问题在这里)= 使 WebDriver 更快!!

下面是描述如何序列化对象的链接。但它需要您从 ISerializable 为您正在序列化的对象实现。我想做的是序列化一个我没有定义的对象——一个基于第 3 方程序集(来自项目引用)中的类的对象,即 。未实现 ISerializable .那可能吗?如何才能做到这一点?

http://www.switchonthecode.com/tutorials/csharp-tutorial-serialize-objects-to-a-file

属性(IWebDriver = 接口(interface)类型):

private IWebDriver driver;

对象实例(FireFoxDriver 是类类型):
driver = new FirefoxDriver(firefoxProfile);

=================

2012 年 3 月 21 日发布答案后更新

为什么这会引发错误?它不喜欢这一行:
serializedObject.DriverInstance = (FirefoxDriver)driver;

...

错误:
Cannot implicitly convert type 'OpenQA.Selenium.IWebDriver' to 'OpenQA.Selenium.Firefox.FirefoxDriver'. An explicit conversion exists (are you missing a cast?)

这是代码:
    FirefoxDriverSerialized serializedObject = new FirefoxDriverSerialized();
Serializer serializer = new Serializer();
serializedObject = serializer.DeSerializeObject(@"C:\firefoxDriver.qa");
driver = serializedObject.DriverInstance;

if (driver == null)
{
driver = new FirefoxDriver(firefoxProfile);
serializedObject.DriverInstance = (FirefoxDriverSerialized)driver;
serializer.SerializeObject(@"C:\firefoxDriver.qa", serializedObject);
}

这是我构建的两个序列化器类:
public class Serializer
{
public Serializer()
{
}

public void SerializeObject(string filename, FirefoxDriverSerialized objectToSerialize)
{
Stream stream = File.Open(filename, FileMode.Create);
BinaryFormatter bFormatter = new BinaryFormatter();
bFormatter.Serialize(stream, objectToSerialize);
stream.Close();
}

public FirefoxDriverSerialized DeSerializeObject(string filename)
{
FirefoxDriverSerialized objectToSerialize;
Stream stream = File.Open(filename, FileMode.Open);
BinaryFormatter bFormatter = new BinaryFormatter();
objectToSerialize = (FirefoxDriverSerialized)bFormatter.Deserialize(stream);
stream.Close();
return objectToSerialize;
}
}

[Serializable()]
public class FirefoxDriverSerialized : FirefoxDriver, ISerializable
{
private FirefoxDriver driverInstance;
public FirefoxDriver DriverInstance
{
get { return this.driverInstance; }
set { this.driverInstance = value; }
}

public FirefoxDriverSerialized()
{
}

public FirefoxDriverSerialized(SerializationInfo info, StreamingContext ctxt)
{
this.driverInstance = (FirefoxDriver)info.GetValue("DriverInstance", typeof(FirefoxDriver));
}

public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
{
info.AddValue("DriverInstance", this.driverInstance);
}
}

==================

2012 年 3 月 23 日更新 #2 - 修复了序列化/反序列化,但有另一个问题

这修复了调用代码。因为我们在调用 WebDriver.Quit() 时删除了 *.qa 文件,因为那是我们选择关闭浏览器的时候。这也会杀死我们缓存的驱动程序。因此,如果我们从一个新的浏览器窗口开始,我们将点击 catch block 并创建一个新实例并将其保存到我们的 *.qa 文件(以序列化形式)。
    FirefoxDriverSerialized serializedObject = new FirefoxDriverSerialized();
Serializer serializer = new Serializer();

try
{
serializedObject = serializer.DeSerializeObject(@"C:\firefoxDriver.qa");
driver = serializedObject.DriverInstance;
}
catch
{
driver = new FirefoxDriver(firefoxProfile);
serializedObject = new FirefoxDriverSerialized();
serializedObject.DriverInstance = (FirefoxDriver)driver;
serializer.SerializeObject(@"C:\firefoxDriver.qa", serializedObject);
}

但是,仍然出现此异常:
Acu.QA.Main.Test_0055_GiftCertificate_UserCheckout:
SetUp : System.Runtime.Serialization.SerializationException : Type 'OpenQA.Selenium.Firefox.FirefoxDriver' in Assembly 'WebDriver, Version=2.16.0.0, Culture=neutral, PublicKeyToken=1c2bd1631853048f' is not marked as serializable.
TearDown : System.NullReferenceException : Object reference not set to an instance of an object.

此代码块中的第 3 行抛出异常:
   public void SerializeObject(string filename, FirefoxDriverSerialized objectToSerialize)
{
Stream stream = File.Open(filename, FileMode.Create);
BinaryFormatter bFormatter = new BinaryFormatter();
bFormatter.Serialize(stream, objectToSerialize); // <=== this line
stream.Close();
}

=====================

更新 #3 - 3/24/2012 - 通过不向构造函数传递任何内容来简化 FirefoxDriver 实例。稍后我将通过将 FirefoxProfile 传递给构造函数来使其更复杂。我仍然得到与更新 #2 相同的异常。

电话号码:
FirefoxDriverSerialized serializedObject = new FirefoxDriverSerialized();
Serializer serializer = new Serializer();
try
{
serializedObject = serializer.DeSerializeObject(@"C:\firefoxDriver.qa");
driver = serializedObject.DriverInstance;
}
catch
{
//driver = new FirefoxDriver(firefoxProfile);
driver = new FirefoxDriver();
serializedObject.DriverInstance = (FirefoxDriver)driver;
serializer.SerializeObject(@"C:\firefoxDriver.qa", serializedObject);
}

还必须在我的序列化对象类的构造函数中添加“:base()”:
[Serializable()]
public class FirefoxDriverSerialized : FirefoxDriver, ISerializable
{
private FirefoxDriver driverInstance;
public FirefoxDriver DriverInstance
{
get { return this.driverInstance; }
set { this.driverInstance = value; }
}

public FirefoxDriverSerialized() : base()
{
}

public FirefoxDriverSerialized(SerializationInfo info, StreamingContext ctxt)
{
this.driverInstance = (FirefoxDriver)info.GetValue("DriverInstance", typeof(FirefoxDriver));
}

public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
{
info.AddValue("DriverInstance", this.driverInstance);
}
}

==============

更新 #4 - 仅记录 OpenQA.Selenium.Firefox.FirefoxDriver 类的 stub 签名
using OpenQA.Selenium;
using OpenQA.Selenium.Remote;
using System;

namespace OpenQA.Selenium.Firefox
{
public class FirefoxDriver : RemoteWebDriver, ITakesScreenshot
{
// CLASS DATA MEMBERS

//public static readonly bool AcceptUntrustedCertificates;
//public static readonly string BinaryCapabilityName;
//public static readonly bool DefaultEnableNativeEvents;
//public static readonly int DefaultPort;
//public static readonly string ProfileCapabilityName;

// CONSTRUCTORS

//public FirefoxDriver();
//public FirefoxDriver(FirefoxProfile profile);
//public FirefoxDriver(ICapabilities capabilities);
//public FirefoxDriver(FirefoxBinary binary, FirefoxProfile profile);
//public FirefoxDriver(FirefoxBinary binary, FirefoxProfile profile, TimeSpan commandTimeout);

// PROPERTIES

protected FirefoxBinary Binary { get; }
protected FirefoxProfile Profile { get; }

// METHODS

//protected override RemoteWebElement CreateElement(string elementId);
//public Screenshot GetScreenshot();
//protected void PrepareEnvironment();
//protected override void StartClient();
//protected override void StopClient();
}
}

最佳答案

创建您自己的源自 ISerializable 的自定义对象以及您要序列化和序列化该自定义对象的对象。如果第 3 方对象是 Sealed,则此特定示例将不起作用(还有其他方法仍然可以与 ISerializable 一起使用)。

根据请求更新

按问题更新

public class MyFirefoxDriver : FirefoxDriver, ISerializable
{
public MyFirefoxDriver(<Interface/Class> firefoxProfile)
:base(firefoxProfile)
{
}

void GetObjectData(SerializationInfo info, StreamingContext context)
{
// Properties needing to be serialized
info.AddValue("SomeProperty", base.SomeProperty);
}
}

更新 2

你的新代码让我很困惑。我想你正在寻找..
serializedObject = serializer.DeSerializeObject(@"C:\firefoxDriver.qa");
driver = serializedObject;

这是因为 FirefoxDriverSerializedFireFoxDriver .

更新 3

需要注意的是,反序列化对象时不会调用构造函数。这意味着通常在构造函数中构造/设置的东西不会在反序列化时进行,这通常会导致 NullReferenceException .解决方法是实现 ISerializable并明确设置类工作所需的对象(GetObjectData 和特殊的反序列化器构造函数)。如果对所讨论对象的理解不简单,或者我们没有它的来源,这可能是最困难的。

It is important to stress that you need to implement both GetObjectData as well as the special constructor when ISerializable is added to a class. The compiler will warn you if GetObjectData is missing, but since it is impossible to enforce the implementation of a constructor, no warnings will be given if the constructor is absent and an exception will be thrown when an attempt is made to deserialize a class without the constructor.
public class MyObject
{
public MyObject()
{
this.SomeOtherObject = new MyObject2();
}
public string Name { get; set; }
public MyObject2 SomeOtherObject { get; set; }
}

public class MyObjectSerializable : MyObject, ISerializable
{
protected MyObjectSerializable(SerializationInfo si, StreamingContext context)
{
// base() is never called during deserialization
// so use the special ISerializable constructor to set the value of the object
// why not add it to the si.AddValue?
// because, most likely in this question, it is not a [Serializable] object either
// so we have to treat it differently as well
this.SomeOtherObject = new MyObject2();
}

public override void GetObjectData(SerializationInfo si, StreamingContext context)
{
si.AddValue("Name", Name);
}
}

关于.NET:将对象从第 3 方程序集序列化为文件(以使 Selenium WebDriver 更快),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9812030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com