«Метод OnDeserialization был вызван, когда объект не был десериализован». от десериализации хэш-таблицы

http://www.rgagnon.com/javadetails/java-0014.html

import java.io.*;
public class CmdExec {

  public static void main(String args[]) {
    try {
      String line;
      Process p = Runtime.getRuntime().exec
        (System.getenv("windir") +"\\system32\\"+"tree.com /A");
      BufferedReader input =
        new BufferedReader
          (new InputStreamReader(p.getInputStream()));
      while ((line = input.readLine()) != null) {
        System.out.println(line);
      }
      input.close();
    }
    catch (Exception err) {
      err.printStackTrace();
    }
  }
}

Вы можете получить локальный путь, используя свойства системы или аналогичный подход .

http://download.oracle.com/javase/tutorial/essential/environment/sysprop.html

1
задан chriwes 13 July 2018 в 12:45
поделиться

1 ответ

Я немного изучил это, используя исходный код . Прежде всего следует отметить, что класс Hashtable уже имеет некоторый контроль версии при сериализации / десериализации , поэтому, возможно, вам не нужно вводить свои собственные и искать причину проблемы где-то еще.

Теперь, переходя к вашему фактическому вопросу, исключение выбрасывается из метода OnDeserialization, потому что SerializationInfoTable пуст . И он пуст, потому что он заполняется только при вызове конструктора сериализации Hashtable(SerializationInfo info, StreamingContext context) , который не вызывается при использовании суррогатов. SerializationInfoTable является внутренним свойством во вложенном внутреннем классе, поэтому вы не можете много сделать с ним.

Что вы можете сделать, это создать унаследованный класс и переопределить GetObjectData и OnDeserialization, чтобы сделать твой материал там. Например,

        [Serializable]
    public class MyHashTable : Hashtable
    {
        private static SerializationInfo serializationInfo = null;

        protected MyHashTable(SerializationInfo info, StreamingContext context) : base(info, context)
        {
        }

        public MyHashTable() : base()
        {

        }
        public override void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            base.GetObjectData(info, context);
            info.AddValue("MyVersion", 0, typeof(int));

            serializationInfo = info;

        }

        public override void OnDeserialization(object sender)
        {
            base.OnDeserialization(sender);
            var myVersion = serializationInfo.GetValue("MyVersion", typeof(string));
            Console.WriteLine($"MyVersion: {myVersion}");
        }
    }
}

Надеюсь, что это поможет.

0
ответ дан Andrew K 17 August 2018 в 12:52
поделиться
  • 1
    Большое вам спасибо за понимание. Это имеет смысл и хорошо работает. Я согласен, что это, вероятно, не устранит мою проблему напрямую, а даст мне контроль над определенной степенью процесса сериализации. Я думаю, что моя проблема связана с некоторыми типами, которые были изменены между версиями, что приводит к десериализации проблемы. – chriwes 16 July 2018 в 11:10
  • 2
    Пожалуйста :) – Andrew K 16 July 2018 в 11:30
Другие вопросы по тегам:

Похожие вопросы: