Бесплатная сериализация WCF Datacontract (3.5 SP1)
-
09-06-2019 - |
Вопрос
У кого-нибудь это действительно работает?Документации о том, как включить эту функцию, не существует, и я получаю исключения из отсутствующих атрибутов, несмотря на наличие проекта 3.5 SP1.
Решение
Я обнаружил, что это не работает с внутренними / частными типами, но, сделав мой тип общедоступным, это сработало нормально.Это также означает отсутствие анонимных типов :(
Используя reflector, я нашел метод ClassDataContract.IsNonAttributedTypeValidForSerialization(тип), который, похоже, принимает решение.Это последняя строка, которая, кажется, является убийцей, тип должен быть видимым, поэтому внутренние / частные типы не допускаются :(
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));
}
Другие советы
Я получил это для работы в тестовом приложении просто отлично...
Определение услуги:
[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()
};
}
}
В WCF существует несколько вариантов сериализации:Контракт с данными, сериализация XML и полезная нагрузка необработанных данных.Что из этого вы пытаетесь использовать?Исходя из вопроса, кажется, что вы пытаетесь использовать что-то отличное от объектов, украшенных атрибутами datacontact.Это то, о чем ты спрашиваешь?
Да, я пытаюсь использовать сериализацию без атрибутов, которая была анонсирована как часть пакета обновления 1 (http://www.pluralsight.com/community/blogs/aaron/archive/2008/05/13/50934.aspx).Будь я проклят, если смогу заставить это работать, а документации на это нет.
Возможно, мое использование абстрактных базовых классов запутывает дело, хотя я добавляю все в список известных типов.
Да, это может быть связано с абстрактными классами и наследованием.Иногда это может привести к сбоям в сериализации.Кроме того, это может быть видимость классов и иерархии классов, если все не является общедоступным.