2009-08-06 3 views
1

저는 WBF 서비스 기반의 솔루션에 protobuf-net을 통합하고 있지만 알아 내지 못한 걸림돌을 만났습니다. 다음 클래스는 ObjectId 속성을 제외한 모든 클래스를 직렬화합니다. 내가 행운 여러 가지를 시도했습니다완고한 객체가 protobuf-net과 직렬화되지 않습니다

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

:

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

여기에 나와 함께 놀거야 클래스입니다. 어떤 생각이라도 대단히 감사하겠습니다!

+0

(문제가 해결 된 경우 "확인"을 클릭하십시오.) 완료) –

답변

2

내가 떠나려고 해요

(내가 protobuf - 그물의 저자 해요), 그래서 나는 "지금"확인할 수없는, 그러나 첫번째 추측에, 나는 말하고 싶지만 그 Order = 0 가능성이있는 범인을 찾습니다. Order = 1 또는 다른 숫자 ("프로토콜 버퍼"식별자는 양수 여야 함)를 시도하십시오.

ObjectIdId에서이 두 가지를 조정해야합니다.

나는 위의 사본을 촬영했습니다, 나는 기차에 확인해 볼게요은 ...

참고 또한 조립 공유를 사용하는 경우 WCF 고리가 가장 적합한 것을 - 같은 클래스가 즉 클라이언트와 서버에서. svcutl (또는 "서비스 참조 추가")를 사용하는 경우 때때로 번호가 다시 매핑됩니다. 이 문제를 해결할 트릭이 있습니다. (기본적으로 도구로 생성 된 속성에 Order을 두 번 확인하십시오)

+0

마크, 그게 다야! 도와 주셔서 감사합니다. Btw, 도서관에서 잘 했어. 마이크 –

관련 문제