将 C# 对象传递给函数并尝试使用 deSerializer 初始化值。更改不会反映在函数外部
Passed C# object to a function and tried to initialize values using deSerializer. The changes are not reflected outside the function
public Reporter(String filePath, FileType type)
{
PropRnW = new PropertyFileReader(filePath, type, this);
}
public PropertyFileReader(String filePath, FileType type, Reporter reporter)
{
OriginalPath = filePath;
Type = type;
this.Read(reporter);
}
private void Read(Reporter m_reporter)
{
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream(SavePath, FileMode.Open, FileAccess.Read);
m_reporter = (Reporter)formatter.Deserialize(stream);
stream.Close();
}
我检查了函数中 m_reporter 的值,值反映准确。虽然当我在函数外检查值时,它们没有改变。
我的代码的问题是我试图在 Read 方法中为 Reporter 对象分配一个新实例:
m_reporter = (Reporter)formatter.Deserialize(stream);
即反序列化 returns 对象的新实例。这个新实例在 Read 方法中分配,因此在 Read 方法的范围内可用。它将 m_reporter 视为局部变量。因此,一旦我们离开 Read 方法的范围,reporter 就会有其原始状态。
因此,在 PropertyFileReader class 中创建一个 属性(如@Gaurav 所建议的)并使用它,即使在 Read 方法之外也可以使用这个新实例。然后我们必须将 属性 的所有属性单独分配给原始实例。
所以,我修改了如下代码:
public Reporter(String filePath, FileType type)
{
PropRnW = new PropertyFileReader(filePath, type);
this.Property1 = PropRnW.m_reporter.Property1;
this.Property2 = PropRnW.m_reporter.Property2;
}
class PropertyFileReader
{
public Reporter m_reporter {get; set;}
public PropertyFileReader(String filePath, FileType type)
{
OriginalPath = filePath;
Type = type;
this.Read();
}
private void Read()
{
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream(SavePath, FileMode.Open, FileAccess.Read);
m_reporter = (Reporter)formatter.Deserialize(stream);
stream.Close();
}
};
public Reporter(String filePath, FileType type)
{
PropRnW = new PropertyFileReader(filePath, type, this);
}
public PropertyFileReader(String filePath, FileType type, Reporter reporter)
{
OriginalPath = filePath;
Type = type;
this.Read(reporter);
}
private void Read(Reporter m_reporter)
{
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream(SavePath, FileMode.Open, FileAccess.Read);
m_reporter = (Reporter)formatter.Deserialize(stream);
stream.Close();
}
我检查了函数中 m_reporter 的值,值反映准确。虽然当我在函数外检查值时,它们没有改变。
我的代码的问题是我试图在 Read 方法中为 Reporter 对象分配一个新实例:
m_reporter = (Reporter)formatter.Deserialize(stream);
即反序列化 returns 对象的新实例。这个新实例在 Read 方法中分配,因此在 Read 方法的范围内可用。它将 m_reporter 视为局部变量。因此,一旦我们离开 Read 方法的范围,reporter 就会有其原始状态。
因此,在 PropertyFileReader class 中创建一个 属性(如@Gaurav 所建议的)并使用它,即使在 Read 方法之外也可以使用这个新实例。然后我们必须将 属性 的所有属性单独分配给原始实例。 所以,我修改了如下代码:
public Reporter(String filePath, FileType type)
{
PropRnW = new PropertyFileReader(filePath, type);
this.Property1 = PropRnW.m_reporter.Property1;
this.Property2 = PropRnW.m_reporter.Property2;
}
class PropertyFileReader
{
public Reporter m_reporter {get; set;}
public PropertyFileReader(String filePath, FileType type)
{
OriginalPath = filePath;
Type = type;
this.Read();
}
private void Read()
{
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream(SavePath, FileMode.Open, FileAccess.Read);
m_reporter = (Reporter)formatter.Deserialize(stream);
stream.Close();
}
};