В C#, как я могу сериализировать Систему. Исключение? (.Net CF 2.0)

Для меня я хотел реализовать двухстороннее рукопожатие, то есть: - родительское окно будет загружаться быстрее iframe - iframe должен поговорить с родительским окном, как только он будет готов - родитель готов получить iframe message и replay

этот код используется для установки белой метки в iframe с использованием [CSS custom property] кода: iframe

$(function() {
    window.onload = function() {
        // create listener
        function receiveMessage(e) {
            document.documentElement.style.setProperty('--header_bg', e.data.wl.header_bg);
            document.documentElement.style.setProperty('--header_text', e.data.wl.header_text);
            document.documentElement.style.setProperty('--button_bg', e.data.wl.button_bg);
            //alert(e.data.data.header_bg);
        }
        window.addEventListener('message', receiveMessage);
        // call parent
        parent.postMessage("GetWhiteLabel","*");
    }
});

parent

$(function() {
    // create listener
    var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
    var eventer = window[eventMethod];
    var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";
    eventer(messageEvent, function (e) {
        // replay to child (iframe) 
        document.getElementById('wrapper-iframe').contentWindow.postMessage(
            {
                event_id: 'white_label_message',
                wl: {
                    header_bg: $('#Header').css('background-color'),
                    header_text: $('#Header .HoverMenu a').css('color'),
                    button_bg: $('#Header .HoverMenu a').css('background-color')
                }
            },
            '*'
        );
    }, false);
});

Естественно, вы можете ограничить исход и текст, это легко работать с кодом. Я нашел этот пример полезным: [Междоменные сообщения с postMessage]

18
задан ctacke 19 January 2009 в 21:06
поделиться

6 ответов

Я думаю, что у Вас в основном есть две опции:

  1. Делают Вашу собственную ручную сериализацию (вероятно, НЕ хотят делать это). Сериализация XML не будет, конечно, работать из-за точного сообщения, Вы входите во внутреннее исключение.
  2. Создают Ваш собственный (сериализуемый) класс исключений, вводят данные из вызванной исключительной ситуации в Вашу пользовательскую и сериализируют это.
7
ответ дан 30 November 2019 в 08:33
поделиться

Я смотрел на ответ Jason Jackson, но он не имел смысла мне, что у меня есть проблемы с этим даже при том, что Система. Исключение реализует ISerializable. Таким образом, я обошел XmlSerializer путем обертывания исключения в класс, который использует BinaryFormatter вместо этого. То, когда XmlSerialization ударов объектов Организации очередей сообщений MS всего это будет видеть, является классом с общедоступным массивом байтов.

Вот то, что я придумал:

public class WrappedException {
    public byte[] Data;

    public WrappedException() {
    }

    public WrappedException(Exception e) {
        SetException(e);
    }

    public Exception GetException() {
        Exception result;
        BinaryFormatter bf = new BinaryFormatter();
        MemoryStream stream = new MemoryStream(Data);
        result = (Exception)bf.Deserialize(stream);
        stream.Close();
        return result;
    }

    public void SetException(Exception e) {
        MemoryStream stream = new MemoryStream();
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize(stream, e);
        Data = stream.ToArray();
        stream.Close();
    }
}

первый тест работал отлично, но я был все еще обеспокоен пользовательскими исключениями. Таким образом, я бросил вместе свое собственное исключение. Затем я просто отбросил кнопку на незаполненном бланке. Вот код:

[Serializable]

public class MyException : Exception, ISerializable {
    public int ErrorCode = 10;
    public MyException(SerializationInfo info, StreamingContext context)
        : base(info, context) {

        ErrorCode = info.GetInt32("ErrorCode");
    }

    public MyException(string message)
        : base(message) {
    }

    #region ISerializable Members
    void ISerializable.GetObjectData(SerializationInfo info, 
        StreamingContext context) {

        base.GetObjectData(info, context);
        info.AddValue("ErrorCode", ErrorCode);
    }

    #endregion
}

private void button1_Click(object sender, EventArgs e) {
    MyException ex = new MyException("Hello, world!");
    ex.ErrorCode = 20;
    WrappedException reply = new WrappedException(ex);
    XmlSerializer x = new XmlSerializer(reply.GetType());
    MemoryStream stream = new MemoryStream();
    x.Serialize(stream, reply);
    stream.Position = 0;
    WrappedException reply2 = (WrappedException)x.Deserialize(stream);
    MyException ex2 = (MyException)reply2.GetException();
    stream.Close();
    Text = ex2.ErrorCode.ToString(); // form shows 20

    // throw ex2;

    }

, Хотя на все другие типы исключительной ситуации казалось, что я искал, отмечены с SerializableAttribute, я оказываюсь перед необходимостью быть осторожным относительно пользовательских исключений, которые не отмечены с SerializableAttribute.

РЕДАКТИРОВАНИЕ: Обгоняние меня. Я не понял, что BinaryFormatter не реализован на CF.

РЕДАКТИРОВАНИЕ: Выше фрагментов кода были в настольном проекте. В версии CF WrappedException будет в основном выглядеть одинаково я всего потребность реализовать мой собственный BinaryFormater, но я очень открыт для предложений на том.

10
ответ дан 30 November 2019 в 08:33
поделиться

Комментарий:

исключения Сериализации общая задача когда дистанционная работа или взаимодействующий с системами через границы процесса. Не слушайте никого, кто говорит иначе; они, вероятно, никогда не писали библиотеку дистанционной работы.

Решение:

я установил вертикально дистанционную работу, чтобы сделать это прежде путем создания пользовательского, основного класса исключений. Проблемой, с которой я столкнулся, была та Система. Исключение не сериализирует легко, таким образом, я должен был наследоваться ему. Путем я обработал, это было путем создания моих собственных исключений, которые действительно сериализировали (через ISerializable) и перенесли любую Систему. Исключение в пользовательском исключении.

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

слой Вы выписываете очереди (и читайте из), должен сделать всю сериализацию/гидратацию исключения. Вы могли бы рассмотреть что-то вроде этого:

public class WireObject<T, E>
{
  public T Payload{get;set;}
  public E Exception{get;set;}
}

сервер и клиентские слои, которые говорят с Вашей очередью, перенесут объект, который Вы отправляете в Полезной нагрузке или присоединяете исключение (если таковые имеются). Когда данные используются от очереди, клиентский слой может проверить на исключение и повторно бросить его, если существующий, еще вручите Вам свои данные.

Это - очень простая версия того, что я записал прежде, и что я видел, что другие пишут. Удача на Вашем проекте.

7
ответ дан 30 November 2019 в 08:33
поделиться

Почему? Вы инстанцируете Исключения после получения его от очереди сообщений? В противном случае просто отправьте сообщение об исключении (как строка)...

2
ответ дан 30 November 2019 в 08:33
поделиться

Вы не можете сериализировать словарь к xml. Сделайте то, что сказал другой парень, и отправьте сообщение, которое является важным битом так или иначе.

-1
ответ дан 30 November 2019 в 08:33
поделиться

Ну, сериализация XML ограничена в ее использовании. Это не может, например, сериализировать этот определенный сценарий. Для точной сериализации и десериализации Исключений необходимо было бы использовать BinaryFormatter, который будет работать, пока собственные исключения отмечены [Serializable]. Все исключения .NET отмечены с этим SerializableAttribute, означая, что они могут быть сериализированы с BinaryFormatter.

существует глюк там, необходимо высматривать, все же.
, Если Ваше исключение не является сериализуемым, оно, очевидно, перестанет работать. Но это также перестанет работать, когда Ваше исключение будет содержать поле, которое не является сериализуемым. Необходимо предостеречься, чтобы удостовериться, что это не возможно в пользовательских исключениях.

0
ответ дан 30 November 2019 в 08:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: