2009-08-06 6 views
1

私はprotobuf-netをWCFサービスベースのソリューションに統合していますが、私が把握できない障害に遭遇しました。次のクラスは、ObjectIdプロパティを除いてすべてシリアライズされます。頑固なオブジェクトはprotobuf-netでシリアル化されません

/// <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; } 
    } 
} 

ここで私と一緒にいじることだクラスです:

/// <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; 
    } 
} 

私は運で複数のものを試してみました。どんな考えでも大歓迎です!

+0

(問題が解決した場合は、完成した通り) –

答えて

2

は私が出ようよ

(私がいるProtobufネットの著者だ)ので、私は「今」を確認することはできませんが、最初の推測では、私が言うと思いそのOrder = 0起こりそうな犯人に見える。 Order = 1またはその他の番号を試してください( "プロトコルバッファ"の識別子は正でなければなりません)。

ObjectIdIdの両方で調整する必要があることに注意してください。

あなたがアセンブリの共有を使用している場合、WCFのフックが最適に動作していることも...

注意を私は上記のコピーを撮影した、と私は電車の中で確認します - あなたは、同じクラスを持っている、すなわち、クライアントとサーバーでsvcutl(または「サービス参照の追加」)を使用している場合は、数値を再マップすることがあります。この問題を解決するにはトリックがあります(基本的には、ツールで生成されたプロパティのOrderをダブルチェックしてください)

+0

マーク、それだった!助けてくれてありがとう。 Btw、図書館の素晴らしい仕事。 マイク –