2017-06-04 1 views
0

[RESOLU] Il y avait une erreur désérialisation l'objet de type « message ». Les données au niveau de la racine est invalideexception C# DataContractSerializer lorsque désérialisation « Les données au niveau racine est invalide »

je le code suivant pour sérialisation/désérialisation

public static byte[] Serialize(object Object) 
    { 
     using (var memoryStream = new MemoryStream()) 
     { 
      DataContractSerializer serializer = new DataContractSerializer(Object.GetType()); 
      serializer.WriteObject(memoryStream, Object); 
      return memoryStream.ToArray(); 
     } 
    } 

    public static Type Deserialize<Type>(byte[] SerializedData) 
    { 
     using (var memoryStream = new MemoryStream(SerializedData)) 
     { 
      DataContractSerializer serializer = new DataContractSerializer(typeof(Type)); 
      return (Type)serializer.ReadObject(memoryStream); 
     } 
    } 

C'est la classe que je suis sérialisation

[DataContractAttribute] 
public class Message 
{ 
    public string MessageType = string.Empty; 
    public string MessageData = string.Empty; 
} 

Voici comment il est utilisé



    void Send(string MessageType, string Data) 
    { 
     Message message = new Message(); 
     message.MessageType = MessageType; 
     message.MessageData = Data; 
     byte[] byteData = Serializer.Serialize(message); // SERIALIZE 

     // Send the data 
     stream.Write(byteData, 0, byteData.Length); 
    } 

    Message Receive() 
    { 
     stream.Read(bytes, 0, bytes.Length); 
     Message message = Serializer.Deserialize(bytes); // DESERIALIZE 
     return message; 
    } 

J'ai essayé plusieurs choses que j'ai trouvées sur g oogle à partir de problèmes similaires, mais je ne peux pas résoudre le problème. Y a-t-il quelque chose qui ne va pas dans la façon de sérialiser?

+0

1) Comment est le membre 'stream' défini? Est-ce la même instance 'Stream' dans' Send() 'et' Receive() '? Si oui, vous souvenez-vous de rembobiner le flux comme indiqué par exemple. [ici] (https://stackoverflow.com/a/40296891/3744182). 2) Votre type 'Message' n'a pas [attributs de membre de données] (https://msdn.microsoft.com/en-us/library/system.runtime.serialization.datamemberattribute.aspx) donc aucune de ses propriétés ne sera sérialisée. – dbc

+0

Le flux est un NetworkStream et est une instance distincte, une sur le serveur et une sur le client. – MuzzyA

Répondre

1

[RESOLU]

Il y avait deux questions. Le premier numéro est [DataContractAttribute] doivent être [Serializable]

[Serializable] 
public class Message 
{ 
    public string MessageType = string.Empty; 
    public string MessageData = string.Empty; 
} 

deuxième est lié à quelque chose non visible dans le code ci-dessus. Le tableau 'bytes' a été initialisé à une taille supérieure à celle des données reçues, ce qui a empêché le désérialiseur de fonctionner correctement.

Je viens de créer un nouveau tableau de données avec la taille appropriée pour passer au désérialiseur

Message Receive() 
{ 
    int messageLength = stream.Read(bytes, 0, bytes.Length); 
    byte[] data = new byte[messageLength]; 
    Array.Copy(bytes, data, messageLength); 

    Message message = Serializer.Deserialize(data); // DESERIALIZE 
    return message; 
}