WCF Datacontract бесплатная сериализация (3.5 SP1) - PullRequest
3 голосов
/ 15 сентября 2008

Кто-нибудь получил это на самом деле работать? Документация о том, как включить эту функцию, отсутствует, и я получаю исключения из отсутствующих атрибутов, несмотря на наличие проекта 3.5 SP1.

Ответы [ 6 ]

1 голос
/ 23 января 2009

Я обнаружил, что он не работает с внутренними / закрытыми типами, но, сделав мой тип общедоступным, он работал нормально. Это также означает отсутствие анонимных типов: (

Используя отражатель, я нашел метод ClassDataContract.IsNonAttributedTypeValidForSerialization (Type), который, кажется, принимает решение. Это последняя строка, которая кажется убийцей, тип должен быть видимым, поэтому не допускаются внутренние / частные типы: (

internal static bool IsNonAttributedTypeValidForSerialization(Type type)
{
    if (type.IsArray)
    {
         return false;
    }
    if (type.IsEnum)
    {
        return false;
    }
    if (type.IsGenericParameter)
    {
        return false;
    }
    if (Globals.TypeOfIXmlSerializable.IsAssignableFrom(type))
    {
        return false;
    }
    if (type.IsPointer)
    {
        return false;
    }
    if (type.IsDefined(Globals.TypeOfCollectionDataContractAttribute, false))
    {
        return false;
    }
    foreach (Type type2 in type.GetInterfaces())
    {
        if (CollectionDataContract.IsCollectionInterface(type2))
        {
            return false;
        }
    }
    if (type.IsSerializable)
    {
        return false;
    }
    if (Globals.TypeOfISerializable.IsAssignableFrom(type))
    {
        return false;
    }
    if (type.IsDefined(Globals.TypeOfDataContractAttribute, false))
    {
        return false;
    }
    if (type == Globals.TypeOfExtensionDataObject)
    {
        return false;
    }
    if (type.IsValueType)
    {
        return type.IsVisible;
    }
    return (type.IsVisible && (type.GetConstructor(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, Globals.EmptyTypeArray, null) != null));

}

1 голос
/ 15 сентября 2008

У меня это отлично работает на тестовом приложении ...

Определение сервиса:

[ServiceContract]
public interface IService1
{

    [OperationContract]
    CompositeType GetData(int value);

}


public class CompositeType
{
    bool boolValue = true;
    string stringValue = "Hello ";

    public bool BoolValue
    {
        get { return boolValue; }
        set { boolValue = value; }
    }

    public string StringValue
    {
        get { return stringValue; }
        set { stringValue = value; }
    }
}

Реализация услуги:

public class Service1 : IService1
{
    public CompositeType GetData(int value)
    {
        return new CompositeType()
        {
            BoolValue = true,
            StringValue = value.ToString()
        };
    }

}
0 голосов
/ 16 сентября 2008

Да, это может быть связано с абстрактными классами и наследованием. Это иногда может связываться с сериализацией. Кроме того, это может быть видимость классов и иерархии классов, если все не открыто.

0 голосов
/ 15 сентября 2008

Возможно, мое использование абстрактных базовых классов сбивает с толку, хотя я все добавляю в список известных типов.

0 голосов
/ 15 сентября 2008

Да, я пытаюсь использовать сериализацию без атрибутов, которая была объявлена ​​как часть SP1 (http://www.pluralsight.com/community/blogs/aaron/archive/2008/05/13/50934.aspx). Будь я проклят, если я смогу заставить его работать, и нет документации для него.

0 голосов
/ 15 сентября 2008

В WCF есть несколько вариантов сериализации: контракт данных, сериализация XML и полезные данные необработанных данных. Что из этого вы пытаетесь использовать? Судя по этому вопросу, кажется, вы пытаетесь использовать что-то, кроме объектов, украшенных атрибутами datacontact. Это то, что вы спрашиваете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...