2011-02-03 20 views
5

我有一个问题,在C#/ ASP.NET,这使准确的错误解串:C#:输入流是不是一个有效的二进制格式

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

我在做什么

我有一个3类结构。我有一个类A是基类,然后B和C类派生自A.

我想在数据库中使用LINQ to SQL存储随机类型的B和C,类型VARCHAR(MAX)。 我无法使用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; 
    } 

因此,在运行第一个Deserialize方法时发生错误,并出现上述错误。

我已经试过几件事情,但我完全迷失在这一个..

谢谢! :-)

+1

BTW:receiver with with _ei_ – 2011-02-03 15:27:43

回答

4

我认为从base64到bytes的覆盖是错误的。

试试这个:

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进行unncode编码。

相关问题