Заменитель DataContract для расширенного типа значения

Я хочу использовать собственный расширенный тип (например, Nullable) в классе DataContract. Я пытался написать IDataContractSurrogate, но при десериализации не получается.

Мой усиленный тип выглядит так:

public struct Amplified<TValue>
{
    public TValue Value { get; set; }
    //... some special code ...
}

И DataContract может выглядеть так:

[DataContract] public class MyDTO
{
     [DataMember] public Amplified<string> SpecialString { get; set; }
}

Приведенный выше код работает, но создает ненужную вложенность со свойством Value расширенного типа. Я хочу, чтобы DataContract представлял Ampliefied как обычную строку на проводе.

Возможно ли это с сериализаторами DataContract (JSON и Xml)? Почему я получаю InvalidCastException при использовании IDataContractSurrogate для замены Amplified строкой?


person sanosdole    schedule 09.11.2011    source источник
comment
Еще информация: исключение суррогатного приведения происходит с усиленным Guid.   -  person sanosdole    schedule 11.11.2011


Ответы (1)


Вы не можете использовать суррогаты для примитивных типов (т. е. вы сможете преобразовать из Amplified<T> в T, когда T является примитивом, но не в другом направлении). Возможную альтернативу см. в разделе «Точный контроль формата сериализации для примитивов» по ​​адресу https://docs.microsoft.com/en-us/archive/blogs/carlosfigueira/wcf-extensibility.-serialization-callbacks.

person carlosfigueira    schedule 15.11.2011
comment
Спасибо. Это многое объясняет. Мы решили проблему, используя другой сериализатор (Json.Net). - person sanosdole; 15.11.2011
comment
@Carlosfigueira спасибо, что вы помогли мне ответить на часть моего вопроса, но если бы у вас было больше информации об этом, я был бы очень признателен - person johnny 5; 04.02.2020