tengo un problema con deserializar en C#/ASP.NET, lo que da el error exacto:C#: La corriente de entrada no es un formato binario válido
El flujo de entrada no es un formato binario válido. Los contenidos iniciales (en bytes) son: 41-41-45-41-41-41-44-2F-2F-2F-2F-2F-41-51-41-41-41 ...
Lo que estoy tratando de hacer
Tengo una estructura con 3 clases. Tengo una clase A que es una clase base, y luego clase B y C que se derivan de A.
Estoy intentando almacenar tipos aleatorios de B y C en la base de datos usando LINQ to SQL, en una columna con el tipo VARCHAR (MAX). No puedo usar BINARY ya que la longitud es de alrededor de 15,000.
Mi código ...
error está en el bloque de código ÚLTIMO
C# Código de Negocios Capa- Almacenamiento de un registro
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# Código de capa de acceso de datos - Almacenar un registro
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# Código de conseguir la entrada en la base de datos
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# de la fábrica, la conversión de LINQ a clase SQL para mis objetos
ESTO ES Aquí el error proviene
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;
}
Entonces, el error se produce cuando se ejecuta el primer método Deserialize, con el error anterior.
He intentado varias cosas pero estoy bastante perdido en este caso ..
Gracias! :-)
BTW: el receptor está con _ei_ –