2016-11-24 3 views
1

У меня есть тайник коллекции System.Globalization.CultureInfo класса в моем классе Context оберткуТип не ожидается, и ни один контракт не может быть выведено с .NET предопределенного класса с Protobuf-нетто

public Collection<System.Globalization.CultureInfo> Cultures 
{ 
    get 
    { 
     // Get the value from Redis cache 
    } 
    set 
    { 
     // Save the value into Redis cache 
    } 
} 

Это могут быть доступны через MyContextWrapper.Current.Cultures.

Я получаю следующее сообщение об ошибке при сериализации значения «Коллекция культур» с protobuf-net:

Тип не ожидается, и ни один контракт не может быть выведен: System.Globalization.CultureInfo

enter image description here

Мне известно о том, что protobuf-net нуждается в декоре [ProtoContract] и [ProtoMember] в классе, но это возможно только для пользовательских пользовательских классов.

Как я могу перейти с .NET предопределенным классом, а затем, например, System.Globalization.CultureInfo в моем случае.

Возможно ли это с protobuf-net?

+0

Почему вы сериализуете информацию о культуре? – Maarten

+0

Помог ли мой ответ? Дайте мне знать, если что-нибудь добавить. – Measuring

ответ

1

Вы можете пойти с суррогатом. Уведомлять protobuf-net об этом перед сериализацией коллекции. Хотя то, что я теперь использую только со встроенными культурами, вы можете расширить его самостоятельно, чтобы добавить дополнительные данные, чтобы полностью восстановить культуру.

Пример

суррогатных для преобразования CultureInfo в поддерживаемом тип Protobuf-сети.

[ProtoContract] 
public class CultureInfoSurrogate 
{ 
    [ProtoMember(1)] 
    public int CultureId { get; set; } 

    public static implicit operator CultureInfoSurrogate(CultureInfo culture) 
    { 
     if (culture == null) return null; 
     var obj = new CultureInfoSurrogate(); 
     obj.CultureId = culture.LCID; 
     return obj; 
    } 

    public static implicit operator CultureInfo(CultureInfoSurrogate surrogate) 
    { 
     if (surrogate == null) return null; 
     return new CultureInfo(surrogate.CultureId); 
    } 
} 

Поместите это где-то в начале программы (по крайней мере, прежде чем вы сериализации коллекции):

RuntimeTypeModel.Default.Add(typeof(CultureInfo), false).SetSurrogate(typeof(CultureInfoSurrogate)); 

Если у вас есть дополнительные вопросы, дайте мне знать в комментариях.

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