Предоставить конкретный объект .net как JSON - PullRequest
3 голосов
/ 16 января 2009

В настоящее время я включаю вызовы JSON для своих веб-служб с помощью атрибута ScriptService. Проблема в том, что один из моих классов ссылается на второй класс, а .Net не берет и не выписывает JavaScript для второго класса.

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

[ScriptService]
public class MyService : WebService {
    [WebMethod]
    public void SaveClass1(Class1 class1) {
        ...
    }
}

[Serializable]
public class Class1 {
    public Class2 class2 { get; set; }
}

[Serializable]
public class Class2 {
}

MyService.asmx / js не будет писать код, который позволил бы мне создать экземпляр Class2, чтобы я мог заполнить Class1. Но я могу заставить его работать, если добавлю:

[WebMethod]
public Class2 Dummy() {
    return new Class2();
}

на MyService. Будем весьма благодарны за любые альтернативы моему отвратительному обходному пути.

Ответы [ 2 ]

5 голосов
/ 24 февраля 2009

Вам необходимо использовать System.Web.Script.Services.GenerateScriptTypeAttribute , который указывает, что тип сервера должен быть включен в сгенерированный прокси-код. Вы можете применить этот атрибут к самому веб-сервису или любому метку, помеченному WebMethodAttribute .

Например:

[ScriptService]
[GenerateScriptType(typeof(Class2))]
public class MyService : WebService {
    [WebMethod]
    public void SaveClass1(Class1 class1) {
        // ...
    }
}
0 голосов
/ 17 января 2009

Ли, не уверен, работает ли это в вашем сценарии JSON / [ScriptService], но для сериализации графа объектов в Searcharoo.net я использовал атрибут System.Xml.Serialization.XmlInclude в базовом классе, который я необходимо сериализовать.

По сути, это сообщает XmlSerializer о Class2, чтобы его можно было включить в сериализацию Class1 ... что-то вроде стратегии "opt-in" для обработки глубоких иерархий объектов.

Вы бы добавили это так (в вашем примере):

[Serializable]
[System.Xml.Serialization.XmlInclude(typeof(Class2))]
public class Class1 {
    public Class2 class2 { get; set; }
}

... а потом это

[WebMethod]
public void SaveClass1(Class1 class1) {
    ...
}

должен вернуть JSON с Class2 данными внутри Class1.

Я сделал быстрый поиск в Google, чтобы найти устранение неполадок ... XmlSerializer , что может быть хорошим чтением. НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...