Сериализация пользовательского основного объекта - PullRequest
0 голосов
/ 22 марта 2012

У меня есть пользовательский основной объект, который я хочу иметь возможность сериализации, чтобы я мог сохранить его в Userdata файла cookie FormsAuthentication. Я пытаюсь использовать DataContractJsonSerializer для этого, но когда происходит сериализация, я просто получаю пустую строку (без исключений).

[DataContract]
public class MyPrincipal : IPrincipal
{
    private readonly MyIdentity _identity;

    public MyPrincipal(MyIdentity identity)
    {
        _identity = identity;
    }

    [DataMember]
    public IIdentity Identity
    {
        get { return _identity; }
        set { }
    }

    public bool IsInRole(string role)
    {
        return _identity.AuthGroups.Contains(role, StringComparer.OrdinalIgnoreCase);
    }

    public bool IsInRole(string[] roles)
    {
        return roles.Any(IsInRole);
    }
}

[DataContract]
public class MyIdentity : IIdentity
{
    private readonly MyCustomData _customData;

    public MyIdentity(MyCustomData customData)
    {
        _customData = customData;
    }

    #region IIdentity properties

    [DataMember]
    public string Name
    {
        get { return Username; }
        set {}
    }

    [DataMember]
    public string AuthenticationType
    {
        get { return "Forms"; }
        set {}
    }

    [DataMember]
    public bool IsAuthenticated
    {
        get { return true; }
        set { }
    }

    #endregion

    #region custom properties

    [DataMember]
    public string FirstName
    {
        get { return _customData.FirstName; } 
        set { }
    }
    [DataMember]
    public string LastName
    {
        get { return _customData.LastName; }
        set { }
    }
    [DataMember]
    public string RedwoodID
    {
        get { return _customData.CedarnetRedwoodID; }
        set { }
    }
    [DataMember]
    public string Username
    {
        get { return _customData.NetworkLogin; }
        set { }
    }
    [DataMember]
    public string CuwasTicket
    {
        get { return _customData.CuwasTicket; }
        set { }
    }
    [DataMember]
    public List<string> AuthGroups
    {
        get { return _customData.GroupMembership; }
        set { }
    }

    #endregion
}

А вот код, который я пытаюсь запустить, чтобы выделить все это:

var serializer = new DataContractJsonSerializer(typeof(MyPrincipal), new List<Type> {typeof(MyPrincipal), typeof(MyIdentity)});
var responseStream = new MemoryStream();
serializer.WriteObject(responseStream, user);
string serializedValue = new StreamReader(responseStream).ReadToEnd();

1 Ответ

1 голос
/ 22 марта 2012

Вы пропустили одну строку:

serializer.WriteObject(responseStream, user);
responseStream.Position = 0; // This!!
string serializedValue = new StreamReader(responseStream).ReadToEnd();

Помните, serializer пишет в поток, а StreamReader начинается с текущей позиции, которая является концом потока.

С другой стороны, сериализация IPrincipal и IIdentity не выглядит хорошей вещью. Причина в том, что они представляют изменчивый статус, который может измениться в любое время (например, разрешение, отозванное после сериализации).

...