2011-02-03 81 views
5

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! :-)

+1

BTW: el receptor está con _ei_ –

Respuesta

4

Creo que la cobertura de base64 a bytes es incorrecta.

Prueba esto:

var bytes = Convert.FromBase64String(base64); 

=>

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

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

Creo que se debe a Convert.ToBase64String(recieverStream.ToArray()) y enc.GetBytes(trace.Reciever) no son homólogos entre sí.

Necesita descodificar el base64 en la parte de decodificación.

Cuestiones relacionadas