Я абстрактный класс называется Message
:Deserialize от ObjectInputStream к одному из подклассов
public abstract class Message
{
public enum MsgType
{
TypeA, TypeB
}
public String Sender;
public MsgType Type;
}
который имеет два подкласса:
public class MessageA extends Message
{
public String A;
public MessageA()
{
Type = MsgType.TypeA;
}
}
public class MessageB extends Message
{
public int B;
public MessageB()
{
Type = MsgType.TypeB;
}
}
Я десериализация объектов непосредственно из ObjectsInputStream
использования Simple библиотеки по либо MessageA
, либо MessageB
в зависимости от того, какой из них считывается из потока.
Я попытался сделать это:
inputStream = new ObjectInputStream(clientSocket.getInputStream());
Message msg = serializer.read(Message.class, inputStream);
// check whether it's MessageA or MessageB by checking Type
Но это не работает, потому что компилятор не может десериализации MessageA
или MessageB
к Message
класса. Кроме того, я уверен, что я потеряю поля подкласса в этом процессе.
Есть ли подходящий способ для этого?
ссылка указывает на библиотеку для ведения XML сериализации и десериализации, который написан и читать с помощью текстовых файлов. Но вы используете ObjectInputStream для чтения данных, что полезно для чтения двоичных данных. Пожалуйста, объясни. – laune
Эта библиотека имеет методы Serializer.validate() в различных формах. Если я это правильно понимаю, вы можете использовать этот метод, чтобы увидеть, представляет ли XML MessageA или MessageB. Когда вы знаете, вы можете вызвать чтение с помощью соответствующего параметра класса. – laune
Я должен десериализовать объекты в C# тоже. Я не думаю, что это возможно с помощью собственного механизма сериализации Java. –