Использовать [сериализуемый] атрибут или разделяющий на подклассы от MarshalByRefObject?

Можете ли вы попробовать использовать FormData():

$("form#files").submit(function(){

    var formData = new FormData($(this)[0]);

    $.ajax({
        url: window.location.pathname,
        type: 'POST',
        data: formData,
        async: false,
        success: function (data) {
            alert(data)
        },
        cache: false,
        contentType: false,
        processData: false
    });

    return false;
});

Вышеприведенный примерный код, но вы можете использовать его для его изменения.

17
задан Theo Lenndorff 1 March 2009 в 12:29
поделиться

4 ответа

Используя MarshallByRef выполнит Ваши методы в удаленном AppDomain. При использовании CreateInstanceAndUnwrap с сериализуемым объектом копия объекта сделана к локальному AppDomain, таким образом, любой вызов метода будет выполняться в локальном AppDomain.

, Если то, что Вы хотите, должно связаться между AppDomains, идут с подходом MarshallByRef.

пример:

using System;
using System.Reflection;

[Serializable]
public class SerializableClass
{
    public string WhatIsMyAppDomain()
    {
        return AppDomain.CurrentDomain.FriendlyName;
    }
}

public class MarshallByRefClass : MarshalByRefObject
{
    public string WhatIsMyAppDomain()
    {
        return AppDomain.CurrentDomain.FriendlyName;
    }
}    

class Test
{

    static void Main(string[] args)
    {
        AppDomain ad = AppDomain.CreateDomain("OtherAppDomain");

        MarshallByRefClass marshall = (MarshallByRefClass)ad.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, "MarshallByRefClass");
        SerializableClass serializable = (SerializableClass)ad.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, "SerializableClass");

        Console.WriteLine(marshall.WhatIsMyAppDomain());
        Console.WriteLine(serializable.WhatIsMyAppDomain());

    }
}

Этот код отобразит "OtherAppDomain" при вызове WhatIsMyAppDomain от объекта MarshallByRef и названия AppDomain по умолчанию, когда Вы звоните от сериализуемого объекта.

21
ответ дан 30 November 2019 в 11:32
поделиться

Эти подходы имеют существенно различные эффекты.

С версией MarshalByRef Вы создаете 1 экземпляр своего объекта. Это будет жить в недавно созданном AppDomain. Весь accesse к объекту сделан через TransparentProxy.

С сериализуемой версией Вы создаетесь 2 экземпляра Вашего объекта. Каждый создается в недавно созданном AppDomain. Вызов CreateInstanceAndUnwrap тогда сериализирует этот объект и десериализует его в домене исходного приложения. Это создает вторую версию объекта, который абсолютно независим сначала. На самом деле очень следующий GC почти наверняка устранит исходный объект, и Вас оставят с одним экземпляром.

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

, Почему оба подхода имеют тот же эффект?

Они делают не , имеют тот же эффект.

С MarshalByRefObject Вы ссылаетесь на один объект через границы AppDomain. С [Serializable] делается копия объекта. Это обнаружится, если состояние объекта будет изменено в дочернем домене и затем исследовано снова (или выполнитесь Console.WriteLine внутренняя часть дочерний AppDomain).

6
ответ дан 30 November 2019 в 11:32
поделиться

MarshalByRefValue и Serializable реализуют другую семантику для дистанционной работы/креста коммуникация AppDomain. MarshalByRefValue по существу дает Вам ссылочную семантику через объект прокси, в то время как Serializable дает Вам семантику значения (т.е. состояние объекта копируется).

, Другими словами MarshalByRefValue позволит Вам изменить экземпляр через другой AppDomains, в то время как Serializable не будет. Последний полезен, когда просто необходимо получить информацию от одного AppDomain до другого, например, получить контент исключения от одного AppDomain до другого.

2
ответ дан 30 November 2019 в 11:32
поделиться
Другие вопросы по тегам:

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