DataContract sérialisation avec R275 protobuf-net
-
21-09-2019 - |
Question
Je viens à la version mis à jour R275 et il ne semble pas gérer correctement les classes DataContract plus En sérialisation cette classe très simple:
[DataContract]
public class ProtoData
{
[DataMember(Order = 1)]
private long _id;
[DataMember(Order = 2)]
private string _firstName;
[DataMember(Order = 3)]
private string _lastName;
public long Id
{
get { return _id; }
set { _id = value; }
}
public string FirstName
{
get { return _firstName; }
set { _firstName = value; }
}
public string LastName
{
get { return _lastName; }
set { _lastName = value; }
}
public ProtoData(long id, string firstName, string lastName)
{
_id = id;
_firstName = firstName;
_lastName = lastName;
}
public ProtoData()
{
}
Je ne reçois que des cours de contrat de données (et les listes / tableaux de tels) peuvent être traitées (traitement d'erreur ProtoData)
La solution
Vraiment? c'est étrange; Je me serais attendu les tests unitaires pour SpT un tel changement de rupture. Etes-vous sûr que vous utilisez la bonne version? Il existe une version 2.0 (qui ne pas inclure le soutien [DataContract]
, car cette approche est WCF, une extension 3.0) et une version 3.0 séparée. Vous voulez la version 3.0 (NET30.zip
).
Testé avec succès R275 / NET30:
static void Main() {
ProtoData pd = new ProtoData {
FirstName = "Marc",
LastName = "Gravell",
Id = 23354
}, clone;
using (MemoryStream ms = new MemoryStream()) {
Serializer.Serialize(ms, pd);
Console.WriteLine(ms.Length);
ms.Position = 0;
clone = Serializer.Deserialize<ProtoData>(ms);
}
Console.WriteLine(clone.FirstName);
Console.WriteLine(clone.LastName);
Console.WriteLine(clone.Id);
}
Avec la sortie:
19
Marc
Gravell
23354
Autres conseils
Effectuez les opérations suivantes:
- Supprimer tous les membres privés
-
Utiliser les propriétés publiques
chaîne publique LastName;
-
Marquer toutes les propriétés publiques avec [DataMember]