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! :-)
BTW: odbiornik jest z _ei_ –