2014-10-13 2 views
0

Это не мой код, который мне просто нужно понять. Исходный программист не может быть достигнут. dobj - всего лишь тип объекта. Мой главный вопрос: Почему он deserialize снова, когда dobj никогда не менялся? Пожалуйста, проигнорируйте все его goto's прямо сейчас, они повсюду в этой программе.Почему он десериализует дважды

 //////////////////////// 
     //Deserialize Original// 
     //////////////////////// 
     dobj = Generics.IO.BinarySerializer.Open(g_PathToTMP); 

     if (dobj == null) 
     { 
      /////// 
      //LOG// 
      /////// 

      goto Label_Done; 
     } 

     dccmcaltered = dobj as ASM001.MatSettings; 

     if (dccmcaltered == null) 
      goto Label_Done; 
     // 

     ////////////////////////////////////////// 
     //Apply Changes To Deserialized Original// 
     ////////////////////////////////////////// 
     dccmcaltered.ObjectLocation = wpuiobj.ObjectLocation; 
     dccmcaltered.ObjectOffset = wpuiobj.ObjectOffset; 
     dccmcaltered.UserDefinedLocation = wpuiobj.UserDefinedLocation; 
     dccmcaltered.Locked = wpuiobj.Locked; 
     dccmcaltered.RinseLocation = wpuiobj.RinseLocation; 
     dccmcaltered.RinseDepth = wpuiobj.RinseDepth; 
     dccmcaltered.DrainLocation = wpuiobj.DrainLocation; 
     dccmcaltered.DrainDepth = wpuiobj.DrainDepth; 
     // 

     //////////////////////// 
     //Deserialize Original//Why did we need to Deserialize again 
     //////////////////////// 
     dobj = Generics.IO.BinarySerializer.Open(g_PathToTMP); 

     if (dobj == null) 
     { 
      /////// 
      //LOG// 
      /////// 

      goto Label_Done; 
     } 

     dccmcoriginal = dobj as ASM001.MatSettings; 
     if (dccmcoriginal == null) 
      goto Label_Done; 
     // 

     bResult = Generics.IO.SerializerPlus.IsBinaryEqual(dccmcoriginal, dccmcaltered); 

     Label_Done: 
     ; 

     bCurrent = bResult; 

     /////////// 
     //Cleanup// 
     /////////// 
     FileInfo fInfo = new FileInfo(g_PathToTMP); 

     if (fInfo.Exists) 
      fInfo.Delete(); 
     // 

     System.Diagnostics.Debug.WriteLineIf(!bCurrent && g_bVerbose, "[Main] Mat is not Current [ASM = 1]!"); 
     System.Diagnostics.Debug.WriteLineIf(bCurrent && g_bVerbose, "[Main] Mat is Current! [ASM = 0]"); 

Редактировать Я добавил остальную часть метода

+1

OMG почему вы/кто бы ни использовал 'goto' .... –

+0

Он был уволен? Является ли код точно таким же, как исходный рабочий процесс после его десериализации во второй раз? Может быть так же просто, как проблема с копией. Просто выглядит как надзор и нет реальной причины. Любой ответ будет чистым предположением. – TyCobb

+1

По сути, это потому, что он плохой программист. Это лишний код, и «goto» просто усиливает мое предположение. – Manhattan

ответ

4

Почему он deserialize снова, когда dobj никогда не менялся?

объект ссылается dobjбыл изменен. Это не тот же объект, независимо от того, относятся ли к нему через dobj или dccmcaltered:

dccmcaltered = dobj as ASM001.MatSettings; 

Это просто получает другую ссылку напечатанный на же объекта;

dccmcaltered.ObjectLocation = wpuiobj.ObjectLocation; 
dccmcaltered.ObjectOffset = wpuiobj.ObjectOffset; 
dccmcaltered.UserDefinedLocation = wpuiobj.UserDefinedLocation; 
dccmcaltered.Locked = wpuiobj.Locked; 

И теперь: значения изменены.

Обратите внимание, что dccmcaltered сохраняет ссылку на этот оригинальный объект, поэтому эти изменения остаются доступными даже после того, как dobj назначен другой объект.

+0

Gotcha, что есть моя нехватка знаний в программировании. Я не понимал, что изменение dccmcaltered изменило dobj. Спасибо –

+1

@JoshDavis важно иметь в виду разницу между * ссылками * и * объектами *. У вас может быть 3000 ссылок, которые указывают на один и тот же объект. Если вы измените этот один объект на * любой * из этих ссылок: изменение будет видно из остальных. В конце концов, есть только один объект *. –

+0

Снова моя нехватка знаний. Я думал, что он создал объект dccmcaltered, а затем устанавливает его члены с dobj как ASM001. Я думал, что это была копия dobj, а не ссылка –

2

Где-то позже он хочет сравнить неизмененные и обновленную версию. Сначала он deserializes dccmcaltered и устанавливает некоторые свойства. Затем он десериализуется в dccmcoriginal, не устанавливая эти свойства.

Рад, что мне не нужно поддерживать это ... Удачи!

Да, сравнение (aargh): bResult = Generics.IO.SerializerPlus.IsBinaryEqual (dccmcoriginal, dccmcaltered);

Поэтому вы можете просто удалить все о dccmcoriginal, и проверить, нужно ли изменять свойства перед их фактическим изменением.

0

Потому что он меняется, во-первых десериализованное объект dobj с линиями как dccmcaltered.ObjectLocation = wpuiobj.ObjectLocation; поэтому он теряет «оригинальные» dccmcaltered.ObjectLocation ценности и «восстанавливает» их (в другой объект) с второй десериализации ... странный парень ... ура

Смежные вопросы