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
Я немного изучил это, используя исходный код . Прежде всего следует отметить, что класс 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}");
}
}
}
Надеюсь, что это поможет.