Этот вопрос близко к тому, что я интересуюсь, но не совсем.
У меня есть приложение WinForms.NET, записанное в C#. У меня есть a ListView
управление, которое отображает массив объектов C#. Я поднял трубку его так, чтобы можно было перетащить/отбросить эти listview объекты к другой форме в том же приложении, и это правильно передает массив объектов (тип Session
) к обработчику отбрасываний для той другой формы.
Однако я теперь хочу поддерживать межпроцессный, перетаскивают/отбрасывают, куда я выполняю несколько экземпляров своего приложения. Это появляется, что это собирается работать (например. GetDataPresent
успешно выполняется), но в конечном счете выдает исключение, когда я на самом деле пытаюсь получить данные - не может бросить object[]
кому: Session[]
.
if (e.Data.GetDataPresent("Fiddler.Session[]"))
{
Session[] oDroppedSessions;
try
{
oDroppedSessions = (Session[])e.Data.GetData("Fiddler.Session[]");
}
catch (Exception eX)
{ // reaches here
}
}
Любой знает, должен ли я реализовать ISerializable
для моих объектов для создания этой работы? Обычно, я просто попробовал бы его, но реализация ISerializable
поскольку этот класс был бы довольно нетривиален, и я волнуюсь, что могут быть странные побочные эффекты выполнения так.
ОБНОВЛЕНИЕ: реализация ISerializable
не помогает - метод никогда не называют. Точно так же добавление Serializable
атрибут к классу не оказывает влияния вообще. Какие-либо другие идеи?
Вы пересекаете границу процесса, ссылки на объекты не действительны в другом процессе. Класс DataObject поддерживает сериализацию объектов, чтобы получить их через стену, он использует BinaryFormatter. Поэтому, да, вам нужно применить атрибут [Serializable] к вашему классу и убедиться, что ваши объекты могут де/сериализоваться правильно.
Хорошо, это выстрел, вместо того, чтобы использовать целый ряд сеансов, попробуйте сделать это индивидуально, как это ...
Session[] oDroppedSessions; try { if (e.Data.GetData("Fiddler.Session[]") != null){ object[] objs = e.Data.GetData("Fiddler.Session[]"); if (objs != null && objs.Length > 1){ oDroppedSessions = new Session[objs.Length]; int nIndex = 0; foreach(object obj in objs){ if (obj is Session){ oDroppedSessions[nIndex] = (Session)obj; nIndex++; } } } } } catch (Exception eX) { // reaches here }
стоит выстрел, кроме того, чем стрельба в ноге, так как я не полностью понимаю сессию Попробуйте это ...
Надеюсь, это поможет, С уважением, Том.
Можно использовать "as" для розыгрыша, который позволит избежать исключения ("as" вернет "null" без броска исключения, если розыгрыш не удастся) - но я не думаю, что это решит вашу проблему (это просто позволит избежать действительного исключения), так как я согласен, что, скорее всего, вам придется сделать ваш класс сериализуемым. Вы можете проверить свою гипотезу, прокомментировав те поля, которые будет сложнее заставить его работать - только пока, чтобы проверить его.