C# 如何使用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绝对不是一个选项。如果你查看文档,你会发现它不接

我想使用一个通用WriteList(List value)函数来使用BinaryWriter编写列表。以下是我正在使用的代码:

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