如何确保T可以按固定的字节数进行序列化?

dlr*_*as2 5 c# generics struct unsafe

我正在写一个DataStructure<T>持久存在磁盘上的通用,我需要写它,T以保证可以在固定的字节数中序列化.例如,int并且char应该被接受,但string还是int[]不应该.同样,struct带有string成员的a 是不可接受的,但unsafe struct带有fixed char数组的是.

我可以使用反射在初始化程序中编写运行时测试并sizeof测试每个成员,但这似乎是一个可怕的黑客.有没有有效的(相对)安全的方法来做到这一点?

Jar*_*Par 5

没有办法静态支持只具有固定特定大小的通用参数.约束仅限于接口,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); 
  }
}
Run Code Online (Sandbox Code Playgroud)

这是有限的,因为它要求您提前列出所有可比类型.如果您想要一个更灵活的解决方案,使用用户定义的类型,您需要实现运行时检查.

public static DataStructure<T> Create<T>(T value) { 
  RuntimeVerification(typeof(T));
  return new DataStructure<T>(value);
}
Run Code Online (Sandbox Code Playgroud)

  • 为了两全其美,`public static Create(T obj)`可以实现对无法识别的类型的运行时检查. (3认同)