我需要写&读取二进制流。看起来像BinaryWriter
& BinaryReader
很适合,但BinaryReader
在任何意义上都不是通用的,而AFAIK BinaryWriter
似乎不能扩展到原始之外的任何东西。来自C ++&知道C#也有通用的编程技术,我认为这很容易解决。
在C ++中,我会写下以下内容:
// Default works for primitives since BinaryWriter::Write has overloads
template< typename SinkT, typename SourceT >
static void Save( SinkT& a_Sink, const SourceT& a_Source )
{
a_Sink.Write( a_Source );
}
// Lets create a better match for some 3rd party vector3 type
template< typename SinkT >
static void Save( SinkT& a_Sink, const SomeVendor::Vector3& a_Source )
{
Save( a_Sink, a_Source[0] );
Save( a_Sink, a_Source[1] );
Save( a_Sink, a_Source[2] );
}
通过提供更好的匹配,我可以轻松支持自己的类型和第三方类型的序列化。有没有办法在C#中做类似的解决方案?我已尝试过两个通用助手类和&amp;静态函数,但似乎不能让它成为网格。
答案 0 :(得分:1)
您想要的(模板)根本不存在于C#中。你可以做一些hacky并使用dynamic
(以你的方式躲避它),但我真的不推荐它。您可能需要简单地找到一种不同的方法。
答案 1 :(得分:1)
如果您需要,可以使用BinaryFormatter将对象序列化/反序列化为二进制流。
答案 2 :(得分:1)
正如我们在评论中讨论的那样,有两种解决方案:
有约束的泛型
static void Save<T, U>(T sink, U source) where T : IWriter,
U : ISerializable
{
// do stuff using that fact that U is serialisable and T implements IWriter
}
IWriter将在哪里:
interface IWriter
{
void Save<U>(U itemToSave) where U : ISerializable;
}
要进行专业化,您只需重载该方法。请参阅this example了解其工作原理。
dyanamic
类型
您可以使用dynamic
类型来调用任意方法,但是会丢失编译时类型检查。
static void Save(dynamic a, dynamic b)
{
a.Save(b);
}
我不确定如何通过重载来提供您需要的专业化。