2011-02-03 10 views
5

Mam problem z deserializacji w C#/ASP.NET, co daje dokładny błąd:C#: Strumień wejściowy nie jest poprawnym formacie binarnym

Strumień wejściowy nie jest poprawnym formacie binarnym. Zawartość początkowa (w bajtach) wynosi: 41-41-45-41-41-41-44-2F-2F-2F-2F-2F-41-51-41-41-41 ...

Co próbuję wykonać

Mam strukturę z 3 klasami. Mam klasy A, która jest klasa podstawowa, a następnie klasy B i C, które pochodzą z A.

Próbuję przechowywać losowe typy B i C w bazie danych za pomocą LINQ do SQL, w kolumnie z typ VARCHAR (MAX). Nie mogę używać BINARIA, ponieważ długość wynosi około 15 000.

mój kod ...

Błąd jest w ostatnim bloku kodu

C# Code in Business Layer Przechowywanie rekord

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

kod C# w warstwie dostępu do danych - Przechowywanie rekordu

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# Code uzyskanie wpisu w bazie danych

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# Factory, konwersji z LINQ do klasy SQL do mojego obiektów

TO jest tu błąd pochodzi

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

Błąd pojawia się, gdy zostanie uruchomiona pierwsza metoda Deserialize, z powyższym błędem.

Próbowałem kilka rzeczy, ale jestem zupełnie zagubiony na ten jeden ..

Dzięki! :-)

+1

BTW: odbiornik jest z _ei_ –

Odpowiedz

4

Myślę, że pokrycie z base64 na bajty jest nieprawidłowe.

Spróbuj tego:

var bytes = Convert.FromBase64String(base64); 

=>

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

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

Myślę, że to dlatego, Convert.ToBase64String(recieverStream.ToArray()) i enc.GetBytes(trace.Reciever) nie są dla siebie nawzajem odpowiedniki.

Musisz oczyścić kod base64 w części dekodującej.

Powiązane problemy