[
https://issues.apache.org/jira/browse/LOG4J2-1795?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15831497#comment-15831497
]
Remko Popma commented on LOG4J2-1795:
-------------------------------------
*LogEvent deserialization behaviour*
The reason that the test program fails is because of some counter-intuitive
asymmetrical behaviour in how LogEvents are serialized and deserialized:
* to serialize a LogEvent you first convert it to a
Log4jLogEvent$LogEventProxy, and serialize _that_ instead.
* however, Log4jLogEvent$LogEventProxy has a {{readResolve}} method that
returns a _Log4jLogEvent_. This is not symmetrical! Deserializing a serialized
Log4jLogEvent$LogEventProxy will give you a Log4jLogEvent.
ObjectInputStream::readObject will return the LogEvent you are looking for.
Please use this object instead.
{code}
@Test
public void testSerialisationsDeserialization_fails() throws IOException,
ClassNotFoundException {
// step 1: convert the LogEvent into a Log4jLogEvent$LogEventProxy instance
(which can be serialized)
Serializable ser = Log4jLogEvent.serialize(event, true);
// step 2: serialize the Log4jLogEvent$LogEventProxy instance to a byte[]
array
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(ser);
byte[] bytes = baos.toByteArray();
// step 3: prepare to deserialize
ObjectInputStream ois = new ObjectInputStream(new
ByteArrayInputStream(bytes));
// step 4: deserialize the byte[] array: this returns a Log4jLogEvent
instance!
// This is *not* a Log4jLogEvent$LogEventProxy instance!
Serializable result = (Serializable) ois.readObject(); // use this object
// step 5: this fails because the ::deserialize method *only* accepts
Log4jLogEvent$LogEventProxy instances
Log4jLogEvent.deserialize(result);
}
{code}
*ParameterizedMessage*
As I noted in a previous comment, in ParameterizedMessage the formatted message
is preserved correctly, but the array of parameter Objects is transient so
message parameters will not survive serialization. This can be enhanced. Do you
need this?
> LogEvent serialization deserialization
> --------------------------------------
>
> Key: LOG4J2-1795
> URL: https://issues.apache.org/jira/browse/LOG4J2-1795
> Project: Log4j 2
> Issue Type: Bug
> Components: Appenders
> Affects Versions: 2.7
> Reporter: Alexandru Ionita
> Labels: serializable
>
> Deserialization of a LogEvent that has been serialized with the
> Log4jLogEvent.serialize method fails after the serialized object went through
> a byte stream.
> Here is a test that demonstrates the issue:
> https://github.com/nucatus/LogEventSerializationPOC
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]