Передал объект C # в функцию и попытался инициализировать значения, используя deSerializer. Изменения не отражаются вне функции - PullRequest
0 голосов
/ 08 января 2019
 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 в функции, и значения отображаются точно. Хотя, когда я проверяю значения один раз за пределами функции, они не меняются.

1 Ответ

0 голосов
/ 08 января 2019

Проблема с моим кодом заключалась в том, что я пытался назначить новый экземпляр объекту Reporter в методе Read:

m_reporter = (Reporter)formatter.Deserialize(stream);

т.е. Десериализация возвращает новый экземпляр объекта. Этот новый экземпляр назначен в методе Read и, следовательно, доступен в области действия метода Read. Он рассматривает m_reporter как локальную переменную. Таким образом, как только мы выйдем из области действия метода Read, репортер получит исходное состояние.

Таким образом, создание свойства (как предложено @Gaurav) в классе PropertyFileReader и его использование делает этот новый экземпляр доступным даже вне метода 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();
        }
};
...