Как я могу гарантировать, что T сериализуем в фиксированном количестве байтов? - PullRequest
5 голосов
/ 11 августа 2011

Я пишу общий DataStructure<T>, который сохраняется на диске, и мне нужно записать его так, чтобы T гарантированно был сериализуемым в фиксированном количестве байтов. Например, int и char должны быть приняты, но string или int[] не должны быть. Аналогично, struct с членом string недопустим, но unsafe struct с массивом fixed char имеет значение.

Я мог бы написать тест во время выполнения в инициализаторе, используя отражение и sizeof, чтобы проверить каждого члена, но это похоже на ужасный взлом. Есть ли эффективный и (относительно) безопасный способ сделать это?

Ответы [ 2 ]

5 голосов
/ 11 августа 2011

Нет способа статически поддерживать универсальный параметр, который имеет только фиксированный определенный размер.Ограничения ограничены интерфейсами, ref / struct, базовым классом и new.

Что вы можете сделать, так это использовать статические фабричные методы, чтобы ограничить использование универсальных типов известным конечным набором подходящих типов.Например,

class DataStructure<T> { 
  private DataStructure(T value) { 
    ...
  }
}
static class DataStructure { 
  public static DataStructure<int> Create(int i) { 
    return new DataStructure<int>(i); 
  }
  public static DataStructure<char> Create(char c) { 
    return new DataStructure<char>(c); 
  }
}

Это ограничивает, поскольку требует, чтобы вы заранее перечислили все сопоставимые типы.Если вы хотите более гибкое решение, которое работает с пользовательскими типами, вам необходимо реализовать проверку во время выполнения.

public static DataStructure<T> Create<T>(T value) { 
  RuntimeVerification(typeof(T));
  return new DataStructure<T>(value);
}
1 голос
/ 11 августа 2011

Каждый тип оценки, который прямо или косвенно содержит только типы значений, но никакие ссылочные типы не имеют ограниченного размера.Единственный способ проверить это во время выполнения, используя отражение.

Если это хорошая идея, это другой вопрос, и я бы сказал, что это не очень хорошая идеяСериализация необработанных данных типа, как правило, плохая идея IMO.

...