2014-08-11 2 views
1

У меня есть следующий класс:Сериализация члена класса в Protobuf

public class A 
{ 
    public Options Options 
    { 
     get { return mOptions; } 
     set { mOptions = new Options(value); } 
    } 
} 

Можно ли шифровать значение Options (первый закодировать в base64 зашифровать его) перед процессом сериализации? Однако я не хочу изменять модификатор доступа члена Options.

+0

Что вы уже пробовали? –

+0

Ну, я не знаком с способом шифрования атрибута напрямую, вместо этого вы можете шифровать и расшифровывать то, что вы можете использовать для сериализации и десериализации соответственно –

+0

@VinayPandey, но как бы преобразовать параметры класса в base64? он должен быть сериализован. –

ответ

2

Protobuf.Net может обрабатывать обратные вызовы после/после сериализации/десериализации. Вы можете использовать их для изменения или инициализации своих полей.

Например, вы можете использовать следующий код, чтобы сделать то, что вам нужно:

[ProtoContract] 
public class A 
{ 
    [ProtoMember(1)] 
    private string m_OptionsEncrypted; 

    private Options mOptions; 

    public Options Options 
    { 
     get { return mOptions; } 
     set { mOptions = new Options(value); } 
    } 

    [ProtoBeforeSerialization] 
    private void OnSerializing() 
    { 
     m_OptionsEncrypted = Encrypt(mOptions); 
    } 

    [ProtoAfterDeserialization] 
    private void OnDeserialized() 
    { 
     mOptions = Decrypt(m_OptionsEncrypted); 
    } 
}; 

Пожалуйста, обратите внимание, что mOptions поле не имеет ProtoMember атрибут. Это позволяет нам сериализовать/десериализовать только поле m_OptionsEncrypted и преобразовать его в класс Options в соответствующие обратные вызовы.

+0

Что делать, если m_Options не является строкой, это просто класс .., который имеет мало членов. Можно ли получить сериализованный класс, затем зашифровать его? используя обратный вызов? –

+0

Да. Возможно. В методе 'Encrypt' вы можете сериализовать' m_Options' в 'Stream', а затем зашифровать и закодировать его до строки base64. – Norfolc

+0

Можно ли явно вызвать один из обратных вызовов, например [ProtoBeforeSerialization]? из любых других классов? –

Смежные вопросы