C# 如何使用BinaryWriter编写列表?
我想使用一个通用WriteList(List value)函数来使用BinaryWriter编写列表。以下是我正在使用的代码:C# 如何使用BinaryWriter编写列表?,c#,binarywriter,C#,Binarywriter,我想使用一个通用WriteList(List value)函数来使用BinaryWriter编写列表。以下是我正在使用的代码: public void WriteList<T>(List<T> value) { for (int i = 0; i < value.Count; i++) { _writer.Write(value[i]); } } BinaryFormatter绝对不是一个选项。如果你查看文档,你会发现它不接
public void WriteList<T>(List<T> value)
{
for (int i = 0; i < value.Count; i++)
{
_writer.Write(value[i]);
}
}
BinaryFormatter绝对不是一个选项。如果你查看文档,你会发现它不接受object的参数(写基元类型),编译器正在尽最大努力实现重载,失败了,因为你不能将t转换为bool,或者BinarwWriter想要的任何东西
您必须将对象转换为BinaryWriter将使用的对象。我真的认为您无法避免使用BinaryFormatter。因为类型T可以是任何复杂的类型,并且T的每个实例都可以表示内存中的巨大变量图 因此,您唯一的解决方案是将T实例转换为byte[]格式,最简单的解决方案是:BinaryFormatter 实际上,.Write()方法只接受基元类型的原因是它知道如何将它们直接转换为byte[](使用convert.ToXXX()),但对于泛型类型T,它无法猜测 作为解决方案,您可以定义如下界面:
public interface IBinarySerializable
{
byte[] GetBytes();
}
然后在类中实现它:
public class MyClass: IBinarySerializable
{
public int X {get;set;}
public byte[] GetBytes()
{
return BitConverter.GetBytes(X); // and anyother
}
}
并将您的方法更改为:
public void WriteList<T>(List<T> value) where T:IBinarySerializable
{
for (int i = 0; i < value.Count; i++)
{
_writer.Write(value[i].GetBytes());
}
}
public void WriteList(列表值),其中T:ibinarySeriable
{
for(int i=0;i
您不能将泛型t传递给BinaryWriter.Write-它有许多特定类型的重载(bool、byte、byte[]、int、string等),但没有泛型。因此,您需要自己做,以某种类似于下面代码的方式
public void WriteList<T>(List<T> value)
{
for (int i = 0; i < value.Count; i++)
{
switch (Type.GetTypeCode(typeof(T))){
//_writer.Write(value[i]);
case TypeCode.Boolean:
_writer.Write((bool)(object)value[i]);
break;
case TypeCode.Byte:
_writer.Write((byte)(object)value[i]);
break;
case TypeCode.Char:
_writer.Write((char)(object)value[i]);
break;
case TypeCode.Decimal:
_writer.Write((decimal)(object)value[i]);
break;
case TypeCode.Double:
_writer.Write((double)(object)value[i]);
break;
case TypeCode.Single:
_writer.Write((float)(object)value[i]);
break;
case TypeCode.Int16:
_writer.Write((short)(object)value[i]);
break;
case TypeCode.Int32:
_writer.Write((int)(object)value[i]);
break;
case TypeCode.Int64:
_writer.Write((short)(object)value[i]);
break;
case TypeCode.String:
_writer.Write((string)(object)value[i]);
break;
case TypeCode.SByte:
_writer.Write((sbyte)(object)value[i]);
break;
case TypeCode.UInt16:
_writer.Write((ushort)(object)value[i]);
break;
case TypeCode.UInt32:
_writer.Write((uint)(object)value[i]);
break;
case TypeCode.UInt64:
_writer.Write((ulong)(object)value[i]);
break;
default:
if (typeof(T) == typeof(byte[]))
{
_writer.Write((byte[])(object)value[i]);
}
else if (typeof(T) == typeof(char[]))
{
_writer.Write((char[])(object)value[i]);
}
else
{
throw new ArgumentException("List type not supported");
}
break;
}
}
public void WriteList(列表值)
{
for(int i=0;i 对T类T:结构的任何约束,比如……使用反射来获取类的所有值类型成员,然后用BinaryWriter一个接一个地写它们。但是,我认为这是您答案的一部分,因为它是唯一可以与之一起使用的地方。但是,如果您有VALU,也可能遇到问题。引用类型作为成员的e类型(struct)。如果您真的想做一些事情,可以实现一个自定义序列化程序以字节[]或字符串等形式输出。我想这是一个很好的理由。说真的!我找到的唯一好的理由是因为您需要Silverlight中的BinaryFormatter。
public void WriteList<T>(List<T> value)
{
for (int i = 0; i < value.Count; i++)
{
switch (Type.GetTypeCode(typeof(T))){
//_writer.Write(value[i]);
case TypeCode.Boolean:
_writer.Write((bool)(object)value[i]);
break;
case TypeCode.Byte:
_writer.Write((byte)(object)value[i]);
break;
case TypeCode.Char:
_writer.Write((char)(object)value[i]);
break;
case TypeCode.Decimal:
_writer.Write((decimal)(object)value[i]);
break;
case TypeCode.Double:
_writer.Write((double)(object)value[i]);
break;
case TypeCode.Single:
_writer.Write((float)(object)value[i]);
break;
case TypeCode.Int16:
_writer.Write((short)(object)value[i]);
break;
case TypeCode.Int32:
_writer.Write((int)(object)value[i]);
break;
case TypeCode.Int64:
_writer.Write((short)(object)value[i]);
break;
case TypeCode.String:
_writer.Write((string)(object)value[i]);
break;
case TypeCode.SByte:
_writer.Write((sbyte)(object)value[i]);
break;
case TypeCode.UInt16:
_writer.Write((ushort)(object)value[i]);
break;
case TypeCode.UInt32:
_writer.Write((uint)(object)value[i]);
break;
case TypeCode.UInt64:
_writer.Write((ulong)(object)value[i]);
break;
default:
if (typeof(T) == typeof(byte[]))
{
_writer.Write((byte[])(object)value[i]);
}
else if (typeof(T) == typeof(char[]))
{
_writer.Write((char[])(object)value[i]);
}
else
{
throw new ArgumentException("List type not supported");
}
break;
}
}