2012-02-08 3 views
1

Я разрабатываю настольное приложение с .NET. Я хотел бы сохранить некоторые данные в файл таким образом, чтобы впоследствии дать мне некоторую свободу в изменении данных, которые я сохраняю, например, добавление новых полей, сохраняя при этом возможность читать записи из более старых форматов.Как настроить приложение для использования DataContracts?

This answer рекомендует использовать DataContractSerializer вместо BinaryFormatter.

Однако я не могу использовать атрибут [DataContract] для своих классов в проекте. После using System.Runtime.Serialization; Я все еще получаю ошибки об неизвестных типах.

Проект нацелен на .NET Framework 4.

Я узнал, что контракты данных являются частью системы WCF, я полагаю, я должен каким-то образом настроить мой проект, чтобы использовать его. Как?

+1

«Я все еще получаю ошибки об неизвестных типах». - не сдавайся; изучите сообщения об ошибках и/или разместите их здесь! – Joe

+0

Добавили ли вы ссылку на System.Runtime.Serialization.dll? – Joulukuusi

+0

@Joulukuusi Похоже, что это помогло, спасибо! Я подтвержу, скоро ли это будет работать, но IDE найдет типы. Я удивлен, потому что [Serializable] работал без добавления этой ссылки, несмотря на то, что в том же пространстве имен. – Kos

ответ

1

В пространствах имен C# могут использоваться общие узлы. Вы должны добавить ссылку на System.Runtime.Serialization.dll, которая содержит атрибут [DataContract].

1

вероятно вам не хватает, чтобы указать атрибут Type знать, когда это необходимо

Взгляните на пример ниже:

public interface ICustomerInfo 
{ 
    string ReturnCustomerName(); 
} 

[DataContract(Name = "Customer")] 
public class CustomerTypeA : ICustomerInfo 
{ 
    public string ReturnCustomerName() 
    { 
     return "no name"; 
    } 
} 

[DataContract(Name = "Customer")] 
public class CustomerTypeB : ICustomerInfo 
{ 
    public string ReturnCustomerName() 
    { 
     return "no name"; 
    } 
} 

[DataContract] 
[KnownType(typeof(CustomerTypeB))] 
public class PurchaseOrder 
{ 
    [DataMember] 
    ICustomerInfo buyer; 

    [DataMember] 
    int amount; 
} 

вы должны указать тип ICustomerInfo иначе сериализации двигатель не может угадайте тип

1

Просто добавьте шаблон обслуживания wcf в ваше приложение и объявите свою функцию и элементы данных своим и ссылкой wcf в свой проект.

Смежные вопросы