【问题标题】:C#: The input stream is not a valid binary formatC#:输入流不是有效的二进制格式
【发布时间】:2011-06-20 17:58:28
【问题描述】:

我在 C#/ASP.NET 中反序列化时遇到问题,它给出了确切的错误:

输入流不是有效的二进制格式。起始内容(以字节为单位)为:41-41-45-41-41-41-44-2F-2F-2F-2F-2F-41-51-41-41-41 ...

我要做什么

我有一个包含 3 个类的结构。我有一个作为基类的 A 类,然后是从 A 派生的 B 类和 C。

我正在尝试使用 LINQ to SQL 在数据库中的类型为 VARCHAR(MAX) 的列中存储随机类型的 B 和 C。 我不能使用 BINARY,因为长度约为 15.000。

我的代码...

错误在最后一个代码块中

业务层中的 C# 代码 - 存储记录

    private void AddTraceToDatabase(FightTrace trace)
    {
        MemoryStream recieverStream = new MemoryStream();
        MemoryStream firedStream = new MemoryStream();
        MemoryStream moveStream = new MemoryStream();

        BinaryFormatter binaryFormatter = new BinaryFormatter();
        binaryFormatter.Serialize(recieverStream,trace.Reciever);
        binaryFormatter.Serialize(firedStream,trace.FiredBy);
        binaryFormatter.Serialize(moveStream,trace.Move);

        string reciever = Convert.ToBase64String(recieverStream.ToArray());
        string fired = Convert.ToBase64String(firedStream.ToArray());
        string move = Convert.ToBase64String(moveStream.ToArray());


        this.dataAccess.AddFightTrace(trace.TraceType.ToString(),reciever,move,fired,trace.DateTime,this.FightId);
    }

数据访问层中的 C# 代码 - 存储记录

    public void AddFightTrace(string type, string reciever, string Move, string firedBy, DateTime firedAt, int fightid)
    {
        GameDataContext db = new GameDataContext();
        dbFightTrace trace = new dbFightTrace();
        trace.TraceType = type;

        trace.Reciever = reciever;
        trace.Move = Move;
        trace.FiredBy = firedBy;
        trace.FiredAt = firedAt;
        trace.FightId = fightid;

        db.dbFightTraces.InsertOnSubmit(trace);
        db.SubmitChanges();
    }

C# 代码获取数据库中的条目

    public List<dbFightTrace> GetNewTraces(int fightid, DateTime lastUpdate)
    {
        GameDataContext db = new GameDataContext();
        var data = from d in db.dbFightTraces
                   where d.FightId==fightid && d.FiredAt > lastUpdate
                   select d;

        return data.ToList();
    }

C# 工厂,从 LINQ 转换为 SQL 类到我的对象

这是错误来了

    public FightTrace CreateTrace(dbFightTrace trace)
    {
        TraceType traceType = (TraceType) Enum.Parse(typeof(TraceType), trace.TraceType);
        BinaryFormatter formatter = new BinaryFormatter();

        System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();

        MemoryStream recieverStream = new MemoryStream(enc.GetBytes(trace.Reciever));
        recieverStream.Position = 0;
        MemoryStream firedStream = new MemoryStream(enc.GetBytes(trace.FiredBy));
        firedStream.Position = 0;
        MemoryStream movedStream = new MemoryStream(enc.GetBytes(trace.Move));
        movedStream.Position = 0;

        // THE NEXT LINE HERE CAUSES THE ERROR
        NPC reciever = formatter.Deserialize(recieverStream) as NPC;
        Player fired = formatter.Deserialize(firedStream) as Player;
        BaseAttack attack = formatter.Deserialize(movedStream) as BaseAttack;

        FightTrace t = new FightTrace(traceType,reciever,attack,fired);
        t.TraceId = trace.FightTraceId;
        t.DateTime = trace.FiredAt;
        return t;
    }

所以在运行第一个反序列化方法时发生了错误,出现上述错误。

我已经尝试了几件事,但我对这一件事很迷茫..

谢谢! :-)

【问题讨论】:

  • 顺便说一句:接收器与 ei

标签: c# asp.net sql linq-to-sql serialization


【解决方案1】:

我认为从 base64 转换回字节是错误的。

试试这个:

var bytes = Convert.FromBase64String(base64);

=>

 MemoryStream recieverStream = new MemoryStream(Convert.FromBase64String(trace.Reciever));

  NPC reciever = formatter.Deserialize(recieverStream) as NPC;

【讨论】:

    【解决方案2】:

    我认为这是因为Convert.ToBase64String(recieverStream.ToArray())enc.GetBytes(trace.Reciever) 不是彼此对应的。

    您需要在解码部分取消对 base64 的编码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多