2010-12-01 4 views
2

J'essaie de stocker certains objets dans une base de données SQL Server Compact (SQL CE) en les sérialisant avec un formateur SOAP. Sérialisation semble fonctionner très bien, mais lorsque je tente de désérialiser l'objet je reçois une erreur disantLa désérialisation à partir de SQL Server Compact génère une "chaîne littérale non fermée". erreur

There is an unclosed literal string. Line 53, position 72.

En outre, après le redémarrage de l'application sur la tentative de remplir l'ensemble de données que je reçois l'erreur suivante:

Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.

Toutes mes colonnes (à l'exception de l'ID) autorisent les valeurs nulles et ne sont pas uniques, donc je n'ai aucune idée d'où cela vient. Voici le code de mon sérialiseur:

public static class Serializer 
{ 
    static public string Serialize(AssessmentReport theObject) 
    { 
     MemoryStream mStream = new MemoryStream();    
     SoapFormatter formatter = new SoapFormatter(); 
     formatter.Serialize(mStream, theObject); 
     byte[] buffer = mStream.ToArray(); 
     mStream.Close(); 
     string value = Encoding.UTF8.GetString(buffer); 
     return value; 
    } 

    static public AssessmentReport Deserialize(string value) 
    { 
     byte[] buffer = Encoding.UTF8.GetBytes(value); 
     MemoryStream mStream = new MemoryStream(buffer); 
     SoapFormatter formatter = new SoapFormatter(); 
     mStream.Position = 0; 
     AssessmentReport theReport = (AssessmentReport)formatter.Deserialize(mStream); 
     mStream.Close(); 
     return theReport; 
    } 
} 

Voici comment j'appelle le sérialiseur (theReport est une instance de l'objet à sérialisé):

examTableAdapter.UpdateAsmFile(Serializer.Serialize(theReport), examID); 

Et voici comment j'appelle la méthode de désérialisation:

string value = Convert.ToString(examTableAdapter.GetAsmFile(2)); 
AsmReport theReport = Serializer.Deserialize(value) 

le champ dans la base de données SQL Server Compact où la chaîne est enregistrée est de type nvarchar avec une limite de 3500.

J'ai essayé d'utiliser un formateur binaire, mais lors de la sérialisation, il semble toujours retourner un tampon octet vide []. J'ai vraiment besoin d'une sérialisation profonde, c'est pourquoi le sérialiseur XML est hors de question.

+2

Avez-vous vérifié que la chaîne sérialisée ne dépasse pas la limite de 3500 caractères? Les représentations SOAP peuvent devenir assez volumineuses. –

+0

Appelez .Flush() sur votre flux avant de le convertir en tableau d'octets. Ça pourrait être buferring. –

+0

Vérifiez-vous le paramètre "value" en passant à la méthode Deserialize? À quoi cela ressemble-t-il? –

Répondre

1

Ok, donc celui que j'ai essayé de comprendre depuis plus de deux mois maintenant. Bien que je n'ai pas trouvé de solution logique au problème, il semble que la modification de l'encodage en utf7 a résolu le problème. Je ne peux pas penser à une raison pour laquelle cela serait le problème, mais il semble être spécifique à ma machine (j'ai finalement eu l'occasion d'exécuter le code sur un autre ordinateur et cela a fonctionné parfaitement avec utf8).

Questions connexes