Что-то вроде это:
Код: Выделить всё
int GetStableHash(string input);
int GetOrRegisterType(Type type)
{
return TypeToId.GetOrAdd(type, t => {
int id = GetStableHash(t.AssemblyQualifiedName ?? t.FullName);
// Handle collisions
while (IdToType.ContainsKey(id++))
{
if (IdToType.TryAdd(id, t))
break;
}
return id ;
});
}
Type? GetTypeById(int id)
{
return IdToType.TryGetValue(id, out Type? type) ? type : null;
}
Для регистрации я планировал отсортировать все сборки и типы в алфавитно-цифровом порядке, чтобы в случае коллизии, надеюсь, их идентификаторы будут определены таким же образом. Это не гарантирует детерминированности, но должно быть чертовски близко к этому.
Хотя я проверил это, и оно работает локально, меня беспокоит, будет ли оно будет надежным методом между платформами и проектами. Я понимаю, что коллизии вызывают беспокойство, но меня больше беспокоит, что есть крайний случай, о котором я не подумал, который может сделать идентификаторы ненадежными для таких вещей, как работа в сети или совместное использование сериализованных файлов.
Подробнее здесь: https://stackoverflow.com/questions/793 ... ialization
Мобильная версия