Когда вы просто указываете DataContractAttribute, но не указываете атрибуты, которые вы специально хотите включить, поведение по умолчанию заключается в сериализации всех полей класса, включая частные.Итак, имена, которые вы получаете, потому что вы используете автоматически реализованные свойства, я полагаю.
Итак, другими словами, измените определение класса, чтобы оно напоминало следующее.Обратите внимание на атрибуты DataMember для свойств, которые я хочу сериализовать.
[DataContract]
public class MyClass {
[DataMember]
public string SomeString {
get;
set;
}
[DataMember]
public int SomeInt {
get;
set;
}
public string DontSerializeThis {
get;
set;
}
}
Это приведет к тому, что DataContractSerializer сериализует свойства , а не их вспомогательные поля, созданные компилятором.Однако для этого требуется, чтобы свойства были общими для чтения / записи, потому что они будут проходить через эти средства доступа к свойствам, чтобы получать и устанавливать сериализованные данные.
Другой вариант - изменить автоматически внедряемые свойства на «нормальные»."свойства, что означает добавление собственных полей поддержки.Затем вы можете либо оставить все атрибуты DataMember отключенными, что означает, что все они будут сериализованы, либо добавить атрибуты DataMember в новые поля, которые вы создали, что позволит вам переименовать их в сериализованный вывод, если хотите.
Наконец, к вашему мнению о том, стоит ли делать сериализуемый класс в обеих системах, не совсем так.Если вы хотите, чтобы класс участвовал в классической сериализации с использованием чего-то вроде BinaryFormatter или XmlSerializer, вам следует просто настроить этот сценарий, поскольку DataContractSerializer уже может сериализовать эти классы.
Если ваша цель - быстрая, эффективная, .NET 3+ для связи .NET 3+ (или Silverlight), DataContract - это путь.Если ваша цель - совместимость и / или контроль над представлением XML, придерживайтесь атрибутов сериализации XML.