SerializationException при установке экземпляра одного класса в другой - PullRequest
0 голосов
/ 10 января 2009

Я пытаюсь передать экземпляр класса между двумя отдельными классами, как показано ниже.

//classes
public class A
{
  public string name;
  public string data;
}

public class B : MarshalByRefObject
{
  public A _a;
}

public class C : MarshalByRefObject
{
  public A _a;
}

//main program
static void Main(string[] args)
{
  B _b = new B();
  C _c = new C();

  _b._a = new A();

  _c._a = _b._a;
}

A существует в обоих классах B и C, и я хочу сделать экземпляр класса A в C равным этому экземпляру класса A в B. Я в основном хочу убедиться, что B и C та же точная копия А.

Однако, когда я пытаюсь выполнить это, я получаю исключение SerializationException, в котором говорится, что класс A не помечен как Serializable. Я знаю, что делал подобные вещи раньше, и никогда не хотел, чтобы это было сериализовано. В любом случае, зачем это нужно? Я думал, что это для сериализации XML.

Я попытался добавить атрибут [Serializable] в класс A, и исключение, очевидно, исчезло. Но после этого внесение изменений в A внутри класса B не распространится на экземпляр A внутри C ... как будто они теперь полностью отдельные копии.

Есть идеи?

Редактировать: раньше не понимал, что это будет иметь значение, но после некоторого осмотра я думаю, что это имеет значение. Классы B и C наследуются от класса MarshalByRefObject. Может быть, это поможет понять это. Я обновил классы выше.

Ответы [ 2 ]

1 голос
/ 10 января 2009

У меня недавно была похожая проблема (обеспечение одноэтапного коробочного значения типа после десериализации).

Чтобы исправить мою проблему, мне пришлось использовать ISerializationSurrogate и SurrogateSelector, чтобы исправить ссылку и не дать ей перезаписаться.

0 голосов
/ 11 января 2009

Я не получаю такого исключения в приведенном выше коде, работающем в Visual Studio. Я не вижу никакой сериализации, вы просто указываете ссылки на разные объекты.

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