2013-11-13 2 views
2

Я унаследовал некоторые классы с большим количеством атрибутов. Я хочу иметь возможность сериализовать их для WCF.DataContractSerializer - это автоматический селератор. Как сделать это Opt-Out?

Как DataContractSerializer - это необязательный сериализатор, мне нужно будет украсить все свойства атрибутом DataMember, который мне кажется немного громоздким. Разве у меня нет другого пути, так что мне не нужно добавлять DataMember ко всем свойствам?

Обратите внимание, что большинство моих свойств необходимо сериализовать.

ответ

0

Это зависит от того, сможете ли вы автоматически создать свои свойства - если это так, вы можете просто заменить сериализатор WCF. Обычно это делается, чтобы использовать вместо Json.NET:

C# WCF REST - How do you use JSON.Net serializer instead of the default DataContractSerializer?

+0

Похоже, что это больше, чем установка атрибута для каждого свойства! –

+0

Как и все, ответ «это зависит». Является ли ваша объектная модель изменяться часто? Будет ли он потребляться кодом .NET и иметь доступные данные KnownTypes, или вы собираетесь повторно использовать абстракции в других слоях (я думаю, что здесь есть Xamarin, который не всегда может правильно определить DataContracts)? Будет ли эта система существовать в относительной изоляции или вы захотите повторно использовать части? – Mathieson

0

То есть, как он был разработан, как указано на этой ссылке MSDN here. Другой альтернативой является использование XmlSerializer, который сериализует все общедоступные поля/свойства. В конечном итоге вам придется взвесить плюсы и минусы при рассмотрении DataContractSerializer и другого подхода.

1

Вы можете просто не отмечать свои классы с любым из атрибутов общей сериализации (т.е. [DataContract]/[Serializable]) и убедитесь, что все свойства, которые вы хотите сериализовать общедоступны get и set. Если вы хотите исключить определенное свойство, вам нужно пометить его атрибутом [IgnoreDataMember].

Пример:

public class Hamster 
{ 
    public string Name { get; set; } 
    [IgnoreDataMember] 
    public int Age { get; set; } 
} 

Serializable Types on MSDN От:

Вы можете применить DataContractAttribute и DataMemberAttribute атрибуты ... Однако, даже типы, которые не отмечены эти атрибуты сериализации и десериализации. Следующие правила и исключения применяются: ...
Все общедоступные поля и свойства с общедоступными методами get и set сериализуются, если вы не примените атрибут IgnoreDataMemberAttribute к этому члену.

0

От DotNet 4,0 и выше,

Вы можете избежать атрибут [DataContract], чтобы сделать все public datamembers serializable.