2011-08-11 9 views
5

Estoy escribiendo un DataStructure<T> genérico que persiste en el disco, y debo escribirlo de forma que se garantice que el número T se puede serializar en un número fijo de bytes. Por ejemplo, int y char deben aceptarse, pero string o int[] no deben ser. Del mismo modo, un struct con un miembro string no es aceptable, pero un unsafe struct con una matriz fixed char es.¿Cómo puedo asegurar que T sea serializable en un número fijo de bytes?

Podría escribir una prueba de tiempo de ejecución en el inicializador usando reflection y sizeof para probar cada miembro, pero eso parece un terrible truco. ¿Hay alguna manera eficiente y (relativamente) segura de hacer esto?

+0

Todas las T están garantizadas para ser de tamaño fijo (ya que cada instancia de una clase tiene el mismo tamaño), su interpretación de la cadena (para el caso cualquier tipo de referencia) es el problema, es posible que tenga que agregar una funda especial para manejar todos los tipos de referencia al reflejar T. http://msdn.microsoft.com/en-us/library/b8ytshk6.aspx –

+0

@Sanjeevakumar - Técnicamente tienes razón, mi título estaba redactado de forma ligeramente incorrecta. Lo he actualizado para reflejar mejor mi pregunta real. – dlras2

+4

Por supuesto, para sufentaty large 'n', todos los datos son serializables en' n' bytes: p kore en serio, ¿está seguro de que quiere registros de tamaño fijo? Es enormemente limitante ... –

Respuesta

5

No hay manera de admitir estáticamente un parámetro genérico que solo tenga un tamaño específico fijo. Las restricciones están limitadas a interfaces, ref/struct, clase base y new.

Lo que puedes hacer es usar métodos de fábrica estáticos para limitar los usos del genérico a un conjunto finito conocido de tipos que sean adecuados. Por ejemplo

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); 
    } 
} 

Esto es limitante porque requiere que haga una lista de todos los tipos comparables con anticipación. Si desea una solución más flexible que funcione con tipos definidos por el usuario, deberá implementar una verificación en tiempo de ejecución.

public static DataStructure<T> Create<T>(T value) { 
    RuntimeVerification(typeof(T)); 
    return new DataStructure<T>(value); 
} 
+0

Esto no es una implementación genérica. –

+0

@Sanjeevakumar, el OP no pidió específicamente uno. La publicación ya indica que están al tanto de cómo hacerlo, solo querían saber si había una mejor manera (y no). – JaredPar

+0

No creo que funcione en esta situación, ya que el punto es apoyar tipos definidos por el usuario, pero es un patrón de fábrica interesante que no había pensado antes. +1 – dlras2

1

Cada tipo de valor que contiene directa o indirectamente solo tipos de valores, pero ningún tipo de referencia tiene un tamaño limitado. La única manera de probar eso es en tiempo de ejecución usando la reflexión.

Si esa es una buena idea, es una pregunta diferente, y yo diría que no es una buena idea. Serializar los datos brutos de un tipo generalmente es una mala idea IMO.

Cuestiones relacionadas