将 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();
        }
};