Хеш-таблица. OnDeserialization

Вы всегда должны передавать указатель void. Это означает, что если вы хотите передать простое значение, такое как 1, вам нужно выделить целочисленное значение и передать указатель на него (как пустой указатель).

Таким образом, что-то вроде:

int x = 4;
upo_stack_push(upo_stack, &x);

Конечно, вы должны убедиться, что переменная int x не выходит из области видимости, в противном случае указатель укажет на свободную память, что приведет к неприятным проблемам с памятью.

Обновление

Выше предполагалось, что указатель void, который вы передаете, уже хранится в памяти для области видимости стека. В случае, если вы хотите, чтобы сам стек копировал данные, вы также должны использовать для этого пространство malloc, таким образом не только неправильно блокируя узел, но также блокируя и копируя передаваемый тип данных. Также, чтобы узнать размер данных (поскольку это пустой указатель, который не знает о его типе), вы должны добавить параметр размера int в функцию push.

Чтобы сохранить целочисленное значение, передайте его как указатель с size: sizeof (int). Чем для копирования структуры данных, используйте memcpy. Это работает только для простых типов и структур без указателей. Если вам нужно копировать структуры с помощью указателей (таким образом, вам нужно так называемое глубокое копирование), то это сложнее.

10
задан Konrad Rudolph 10 November 2008 в 23:15
поделиться

2 ответа

Это - действительно интересная проблема. После проверки сериализации кодируют с Отражателем, я думаю, что нет никакого обычно хорошего 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 предложенным.

6
ответ дан 4 December 2019 в 01:58
поделиться

Я подозреваю, что Вы уже погуглили, но я произошел с через этот шаблон вчера.

public BoringClass(SerializationInfo info, StreamingContext context)
{
    Hashtable hashtable = (Hashtable) info.GetValue("hash", typeof(Hashtable));
    hashtable.OnDeserialization(this);

    Console.WriteLine("Value is: " + hashtable["testItem"]);

}
3
ответ дан 4 December 2019 в 01:58
поделиться
Другие вопросы по тегам:

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