Тип <Тип> с именем контракта данных <имя контракта> не ожидается

1

Я использую Catel Framework в приложении WPF для рабочего стола, и когда я пытаюсь сохранить модель в файле, я получаю следующую ошибку.

Type 'GeoChemicalFuncsCS.Core.Models.BoilingModel' with data contract name 'BoilingModel:http://schemas.datacontract.org/2004/07/GeoChemicalFuncsCS.Core.Models' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

Я попробовал добавить к модели тег KnownType и ServiceKnownType, но я получаю:

KnownType could not be found.

или

ServiceKnownType could not be found.

И я также попробовал WarmingUp SerializationFactory в ViewModel:

var typesToWarmup = new Type[] { typeof(BoilingModel) };
SerializationFactory.GetXmlSerializer().Warmup(typesToWarmup);

но ничего не изменилось.

Есть ли у кого-нибудь предложения? Что я могу сделать в этот момент?

Спасибо Саулу Идальго.

  • 0
    Теперь я понимаю. Вы вообще не используете WCF. Забудь, что я писал раньше. Что такое SerializationFactory ? Кажется, не является частью .NET Framework, но похоже, что он пытается использовать механизмы сериализации WCF, что, вероятно, не то, что вам нужно. Для простой XML-сериализации объектов вы должны использовать System.Xml.Serialization.XmlSerializer .
  • 0
    Вы используете последнюю предварительную версию? Мы внесли численные улучшения в Catel 4.0 (будущая версия) в движке сериализации.
Показать ещё 1 комментарий
Теги:
wpf
serialization
catel

2 ответа

0
Лучший ответ

После некоторой работы я, наконец, решил это.

Проблема возникла из-за того, что у меня была коллекция, содержащая 2 типа объектов (обе сериализуемые). Я попытался обобщить его, создав коллекцию "объект", и когда мне нужно было использовать его, я его бросил.

Ну, механизм serializer нашел тип "объект", и когда он попытался сериализоваться, он обнаружил, что это действительно BoilingModel.

Решение просто выполняло интерфейс, и теперь оба сериализуемых типа реализуют этот интерфейс.

Надеюсь, это поможет кому-то другому с той же проблемой.

С уважением, Саул.

0

Похоже, что вы (или библиотека Catel) каким-то образом пытаетесь использовать WCF DataContractSerializer для простой сериализации простого объекта в файл XML. Это не то, для чего предназначен DataContractSerializer - он в основном предназначен для сериализации объектов данных в SOAP для отправки через веб-службу WCF и требует сложной конфигурации.

Для простой сериализации XML аннотируйте класс/структуру, которая будет сериализована с помощью [Serializable] и используйте System.Xml.Serialization.XmlSerializer.

Пример (не проверен):

var boilingModelObj = new BoilingModel();
// ... fill object with data ...
var serializer = new XmlSerializer(typeof(BoilingModel));
using (var writer = new StreamWriter("boilingmodel.xml"))
{
    serializer.Serialize(writer, boilingModelObj);
}
  • 0
    Модели - это не «простые объекты», это все динамично.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню