2009-08-06 3 views
1

Ich integriere Protobuf-Net in unsere WCF-Services-basierte Lösung, aber rannte in einen Haken, den ich nicht herausfinden kann. Die folgende Klasse wird mit Ausnahme der ObjectId-Eigenschaft ordnungsgemäß serialisiert.Hartnäckige Objekt wird nicht mit Protobuf-Net serialisieren

/// <summary> 
/// A service data object that represents a user of the system. 
/// </summary> 
[DataContract(Namespace = "http://LINKS.Service.Security.Administration", Name = "User")] 
public sealed class UserMessagePart : IMessagePart 
{ 
    private ObjectId objectId; 
    private string userName; 
    private string firstName; 
    private string lastName; 
    private string middleName; 
    private string gender; 
    private string emailAddress; 
    private bool isAccountDisabled; 
    private string disabledMeaning; 
    private DateTime createDtTm; 
    private DateTime disabledDtTm; 
    private VersionMessagePart version; 

    /// <summary> 
    /// Main constructor. 
    /// </summary> 
    public UserMessagePart(ObjectId objectId, string userName, string firstName, string lastName, string middleName, 
        string gender, string emailAddress, bool isAccountDisabled, string disabledMeaning, DateTime createDtTm, 
        DateTime disabledDtTm, VersionMessagePart version) 
    { 
     this.objectId = objectId; 
     this.userName = userName; 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.middleName = middleName; 
     this.gender = gender; 
     this.emailAddress = emailAddress; 
     this.isAccountDisabled = isAccountDisabled; 
     this.disabledMeaning = disabledMeaning; 
     this.createDtTm = createDtTm; 
     this.disabledDtTm = disabledDtTm; 
     this.version = version; 
    } 

    /// <summary> 
    /// Parameterless constructor. 
    /// </summary> 
    public UserMessagePart(){} 

    /// <summary> 
    /// The unique identifier for this user. 
    /// </summary> 
    [DataMemberAttribute(IsRequired = true, Name = "ObjectId", Order = 0)] 
    public ObjectId ObjectId 
    { 
     get { return objectId; } 
     set { objectId = value; } 
    } 

    /// <summary> 
    /// The user's login identity. 
    /// </summary> 
    [DataMemberAttribute(IsRequired = true, Name = "UserName", Order = 1)] 
    public string UserName 
    { 
     get { return userName; } 
     set { userName = value; } 
    } 

    // ...abbreviated code for readability... 

    /// <summary> 
    /// Version information for this user 
    /// </summary> 
    [DataMemberAttribute(IsRequired = true, Name = "Version", Order = 11)] 
    public VersionMessagePart Version 
    { 
     get { return version; } 
     set { version = value; } 
    } 
} 

Hier ist die Klasse, die mit mir liebäugelt ist:

/// <summary> 
/// Uniquely identifies any <see cref="IMessagePart"/> implementation in the system. 
/// </summary> 
[DataContract(Namespace = "http://LINKS.Service.Core", Name = "ObjectIdentifier")] 
public class ObjectId 
{ 
    private string id; 
    private string domain; 
    private string modelName; 
    private long instanceId; 
    private int versionNumber; 

    /// <summary> 
    /// Default constructor. (required for Protobuf-net) 
    /// </summary> 
    public ObjectId() 
    { 
    } 

    /// <summary> 
    /// Main constructor. 
    /// </summary> 
    public ObjectId(string domain, string modelName, long instanceId, int versionNumber) 
    { 
     id = string.Format("{0}#{1}#{2}#{3}", domain, modelName, instanceId, versionNumber); 
     this.domain = domain; 
     this.modelName = modelName; 
     this.instanceId = instanceId; 
     this.versionNumber = versionNumber; 
    } 

    /// <summary> 
    /// The unique identifier for the <see cref="ObjectId"/>. The format of this string is not 
    /// guaranteed and should only be treated as a unique key. No attempts to parse it should be 
    /// made by client applications. 
    /// </summary> 
    [DataMemberAttribute(IsRequired = true, Name = "Id", Order = 0)] 
    public string Id 
    { 
     get { return id; } 
     set 
     { 
      id = value; 
      string[] parts = id.Split('#'); 
      domain = parts[0]; 
      modelName = parts[1]; 
      instanceId = long.Parse(parts[2]); 
      versionNumber = int.Parse(parts[3]); 
     } 
    } 

    /// <summary> 
    /// The system domain that the <see cref="ObjectId"/> originated from. 
    /// </summary> 
    public string Domain 
    { 
     get { return domain; } 
    } 

    /// <summary> 
    /// The type of object that this <see cref="ObjectId"/> refers to. 
    /// </summary> 
    public string ModelName 
    { 
     get { return modelName; } 
    } 

    /// <summary> 
    /// The object instance identifier for the object that this <see cref="ObjectId"/> 
    /// refers to. Typically, this is a database key. 
    /// </summary> 
    public long InstanceId 
    { 
     get { return instanceId; } 
    } 

    /// <summary> 
    /// The version instance of the object referred to by this <see cref="ObjectId"/> 
    /// </summary> 
    public int VersionNumber 
    { 
     get { return versionNumber; } 
    } 

    /// <summary> 
    /// Returns a string representation of the object identifier. 
    /// </summary> 
    new public string ToString() 
    { 
     return id; 
    } 
} 

ich mehrere Dinge ohne Glück versucht haben. Irgendwelche Gedanken würden sehr geschätzt werden!

+0

(wenn das Problem gelöst wurde, klicken Sie bitte auf das "Häkchen" zu markieren ist wie fertig) –

Antwort

2

(ich bin der Autor von protobuf-net)

Ich bin zu verlassen, so dass ich nicht überprüfen kann „gerade jetzt“, aber bei einer ersten Vermutung, ich würde sagen, dass die Order = 0 sieht ein wahrscheinlicher Täter aus. Versuchen Sie Order = 1 oder eine andere Nummer ("Protokollpuffer" Bezeichner müssen positiv sein).

Beachten Sie, dass Sie dies sowohl unter als auch unter Id anpassen müssen.

ich eine Kopie der oben genommen haben, und ich werde auf dem Zug überprüfen ...

Beachten Sie auch, dass die WCF Haken am besten funktionieren, wenn Sie Montage-Sharing verwenden - also Sie die gleiche Klasse haben auf dem Client und Server. Wenn Sie svcutl (oder "Add Service Reference") verwenden, werden manchmal die Nummern neu zugeordnet; es gibt einen Trick, um dies zu beheben - lassen Sie mich wissen, wenn dies ein Problem ist (im Grunde, überprüfen Sie die Order auf die Eigenschaften von der Werkzeugausstattung generiert)

+0

Marc, das wars! Danke für die Hilfe. Übrigens, großartige Arbeit in der Bibliothek. Mike –