Действительно ли возможно возвратить интерфейсы из веб-сервисов .NET, или одно единственное может возвратить реальные классы?

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    timesheet_jobs = self.fields['timesheet_jobs']                                    
    timesheet_jobs.choices = list(timesheet_jobs.choices)
    timesheet_jobs.choices.append(tuple(('create_new_job', 'Create New Job')))
7
задан Fadeproof 29 January 2009 в 08:59
поделиться

3 ответа

Короткий ответ не, Вы не можете возвратить интерфейс через WebService.

Длинный ответ - то, что можно отчасти получить поведение, которое Вы хотите, но это - немного hacky. Решение состоит в том, чтобы использовать двоичную сериализацию. Таким образом, Вы сериализируете свой тип к байтам, имеете веб-возврат метода ряд байтов, и затем с другой стороны Вы десериализовали бы байты назад к Вашему составному типу.

Например,

[WebMethod]
public byte[] GetMyComplexType()
{

   IMyComplexType myCt = new MyComplexType();
   ...

   MemoryStream stream = new MemoryStream();
   IFormatter fmt = new BinaryFormatter();
   fmt.Serialize(stream, myCt);
   stream.Flush();
   byte[] bytes = stream.ToArray();
   stream.Close();

   return bytes;
}

Необходимо будет преобразовать все назад в другом конце.

byte[] bytes = service.GetMyComplexType();
MemoryStream stream = new MemoryStream(bytes);
BinaryFormatter fmt = new BinaryFomatter();
MyComplexType myCt = fmt.DeSerialize(stream);

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

С другой стороны, если они - Ваши интерфейсы затем, Вы могли бы превратить их в Абстрактные классы. Однако это не будет работать, если Вы захотите, чтобы класс реализовал несколько интерфейсов (или Вы уже наследовались другому классу), как можно только наследовать один класс. При необходимости в некотором полиморфном поведении на клиенте необходимо будет использовать атрибут XmlInclude.

2
ответ дан 7 December 2019 в 18:46
поделиться

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

0
ответ дан 7 December 2019 в 18:46
поделиться

Вы не должны реализовывать ISerializable - просто отмечая интерфейс с Serializable атрибут должен быть всем, что необходимо сделать. Если Вы захотите реализовать интерфейс, любой ценой идти вперед то - он даст Вам мелкомодульный контроль над тем, как интерфейс сериализируется. Но я предположил бы, что реализация по умолчанию должна быть в порядке. Также проверьте, чтобы удостовериться, что все интерфейсные участники являются сериализуемыми также.

[Редактирование] я даже не думал прямо - нет никакого способа, которым Вы сможете реализовать ISerializable поскольку Вы пытаетесь сериализировать iterface так или иначе. Место, где ISerializable было бы соответствующим, будет на пользовательских типах, которым нужна пользовательская сериализация, которые выставляются интерфейсом.

0
ответ дан 7 December 2019 в 18:46
поделиться
Другие вопросы по тегам:

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