Вы всегда должны передавать указатель void. Это означает, что если вы хотите передать простое значение, такое как 1, вам нужно выделить целочисленное значение и передать указатель на него (как пустой указатель).
Таким образом, что-то вроде:
int x = 4;
upo_stack_push(upo_stack, &x);
Конечно, вы должны убедиться, что переменная int x не выходит из области видимости, в противном случае указатель укажет на свободную память, что приведет к неприятным проблемам с памятью.
Обновление
Выше предполагалось, что указатель void, который вы передаете, уже хранится в памяти для области видимости стека. В случае, если вы хотите, чтобы сам стек копировал данные, вы также должны использовать для этого пространство malloc, таким образом не только неправильно блокируя узел, но также блокируя и копируя передаваемый тип данных. Также, чтобы узнать размер данных (поскольку это пустой указатель, который не знает о его типе), вы должны добавить параметр размера int в функцию push.
Чтобы сохранить целочисленное значение, передайте его как указатель с size: sizeof (int). Чем для копирования структуры данных, используйте memcpy. Это работает только для простых типов и структур без указателей. Если вам нужно копировать структуры с помощью указателей (таким образом, вам нужно так называемое глубокое копирование), то это сложнее.
Это - действительно интересная проблема. После проверки сериализации кодируют с Отражателем, я думаю, что нет никакого обычно хорошего soluiton, если отнесенный класс использует IDeserializationCallback.
Вероятно, Вы видели, что существует два других пути также для выполнения некоторого кода во время десериализации, [OnDeserializing] и [OnDeserialized] атрибуты. Unfortuanately оба выполнения перед IDeserializationCallback. OnDeserialization (). Это - порядок выполнения методов, если у Вас есть class1, который относится к class2:
Class1: [OnDeserializing]
Class2: [OnDeserializing]
Class2: [OnDeserialized]
Class1: [OnDeserialized]
Class1: IDeserializationCallback.OnDeserialization
Class2: IDeserializationCallback.OnDeserialization
Как Вы видите, [OnDeserializing] и [OnDeserialized] последовательная работа атрибутов, но методы IDeserializationCallback не действительно... :(
Я также проверил реализацию OnDeserialization Хеш-таблицы и Словаря, и оба, кажется, безопасны для вызова OnDeserialization несколько раз (только первый вызов выполнит необходимую операцию, последующие вызовы ничего не сделают).
Таким образом, наконец необходимо назвать OnDeserialization () Хеш-таблицы как Sean и Brian предложенным.
Я подозреваю, что Вы уже погуглили, но я произошел с через этот шаблон вчера.
public BoringClass(SerializationInfo info, StreamingContext context)
{
Hashtable hashtable = (Hashtable) info.GetValue("hash", typeof(Hashtable));
hashtable.OnDeserialization(this);
Console.WriteLine("Value is: " + hashtable["testItem"]);
}