Беда с десериализацией в моно - PullRequest
3 голосов
/ 21 февраля 2010

Кто-нибудь знает, почему следующий XML, сгенерированный сериализатором контракта данных в C #, прекрасно работает в Windows, но не в Linux на Mono?

XML:

<Message i:type="UserMessage" xmlns="http://schemas.datacontract.org/2004/07/NetTunnel"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><type>UserMessage</type>
<nick>Unnamed</nick><services><Service><enabled>true</enabled><port_ranges i:nil="true"/>
<service_name>vent</service_name></Service></services><state>Created</state>
<userid>1</userid></Message>

Ошибка:

Unhandled Exception: System.Runtime.Serialization.SerializationException: Deserializing 
type 'System.Object'. Expecting state 'EndElement'. Encountered state 'Element' with 
name 'enabled' with namespace 'http://schemas.datacontract.org/2004/07/NetTunnel'.

Также выдает ошибку, если в списке нет служб (тег xml <services/>). Переменная services имеет тип List<Service>. Это просто моно, с которым не справиться? Будет ли другой тип более подходящим? Или это что-то совсем другое?

Ответы [ 3 ]

2 голосов
/ 21 февраля 2010

Не тот ответ, который вам нужен, но: Каждое поведение в Mono, отличное от .Net, - это все, что я знаю ошибка в Mono. Пожалуйста (!) подайте , особенно если он действительно такой маленький и его легко воспроизвести. Обсудить это здесь может помочь так же быстро, но следующий парень может столкнуться с той же проблемой, ему нужно исследовать проблему и т. Д.

Просто подайте , парни из Mono просто великолепны и будут более полезны. Чтобы помочь другим в их поиске: я предлагаю вам обновить свое сообщение со ссылкой на вопрос.

Относительно вашего последнего вопроса: вам не нужно менять тип только потому, что Mono, возможно, придется десериализовать его - и List в порядке.

1 голос
/ 21 февраля 2010

Из комментариев вам не нужен WCF и вы просто хотите поделиться данными. В этом случае я бы посмотрел на protobuf-net . Я довольно пристрастен (так как я автор), но он бесплатен (с источником), поэтому я не рекомендую это из собственной выгоды. Просто; это быстрый, переносимый API сериализации, смоделированный по формату данных "буферов протокола" Google. Очень быстрая обработка (как правило, намного быстрее, чем, например, в xml) и довольно маленькая на проводе.

Если вы уже используете контракты данных, вы можете изменить их, просто добавив уникальные значения Order (он использует это как числовой идентификатор):

[DataContract]
public class Foo {
    [DataMember(Order = 1)]
    public int Id {get;set;}

    [DataMember(Order = 2)]
    public string Name {get;set;}
}

(или вы можете использовать определенные атрибуты protobuf-net)

Полный исходный код доступен, и он работает на Mono, обычном .NET, CF и т. Д.

0 голосов
/ 21 февраля 2010

Отправлено сообщение об ошибке здесь: https://bugzilla.novell.com/show_bug.cgi?id=581611

Было бы здорово узнать о любых альтернативах, пока это не будет исправлено.

...