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

发布于 2024-11-28 21:15:06 字数 399 浏览 0 评论 0原文

我正在编写一个保留在磁盘上的通用 DataStructure ,并且我需要编写它,以便保证 T 能够以固定字节数进行序列化。例如,应接受 intchar,但不应接受 stringint[]。同样,具有 string 成员的 struct 是不可接受的,但具有 fixed char 数组的 unsafe struct 是可接受的。

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

I'm writing a generic DataStructure<T> which persists on the disk, and I need to write it such that T is guaranteed to be serializable in a fixed number of bytes. For example, int and char should be accepted, but string or int[] should not be. Likewise, a struct with a string member is not acceptable, but an unsafe struct with a fixed char array is.

I could write a runtime test in the initializer using reflection and sizeof to test each member, but that seems like a terrible hack. Is there any efficient and (relatively) safe way to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

温柔少女心 2024-12-05 21:15:07

没有办法静态支持仅具有固定特定大小的通用参数。约束仅限于接口、引用/结构、基类和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);
}

There is no way to statically support a generic parameter which only have a fixed specific size. Constraints are limited to interfaces, ref / struct, base class and new.

What you can do though is use static factory methods to limit the uses of the generic to a known finite set of types which are suitable. For example

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

This is limiting though because it requires you to list all comparable types ahead of time. If you want a more flexible solution that works with user defined types you'll need to implement a runtime check.

public static DataStructure<T> Create<T>(T value) { 
  RuntimeVerification(typeof(T));
  return new DataStructure<T>(value);
}
没︽人懂的悲伤 2024-12-05 21:15:07

每个直接或间接仅包含值类型但不包含引用类型的值类型都有大小限制。测试它的唯一方法是在运行时使用反射。

如果这是一个好主意,那就是另一个问题了,我想说这不是一个好主意。在我看来,序列化类型的原始数据通常是一个坏主意。

Every valuetype that directly or indirectly contains only value types, but no reference types has a limited size. The only way to test that is at runtime using reflection.

If that is a good idea is a different question, and I'd say it's not a good idea. Serializing the raw data of a type is generally a bad idea IMO.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文