[
https://issues.apache.org/jira/browse/SOLR-18196?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18088397#comment-18088397
]
Vadim Kirilchuk commented on SOLR-18196:
----------------------------------------
Hm, the following test works fine to me on current main(QueryResponseTest):
{noformat}
@Test
public void testQueryResponseSerialization() throws Exception {
XMLResponseParser parser = new XMLResponseParser();
NamedList<Object> response; try (SolrResourceLoader loader = new
SolrResourceLoader(Path.of("").toAbsolutePath());
InputStream is = loader.openResource("solrj/sampleDebugResponse.xml")) {
assertNotNull(is);
try (Reader in = new InputStreamReader(is, StandardCharsets.UTF_8)) {
response = parser.processResponse(in);
}
} QueryResponse qr = new QueryResponse(response);
assertNotNull(qr);
assertNotNull(qr.getResults());
assertEquals(2, qr.getResults().getNumFound());
assertNotNull(qr.getExplainMap()); // Serialize
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(baos);
out.writeObject(qr);
out.close(); // Deserialize
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
QueryResponse deserialized = (QueryResponse) ois.readObject();
ois.close(); // Verify round-trip
assertNotNull(deserialized);
assertNotNull(deserialized.getResults());
assertEquals(qr.getResults().getNumFound(),
deserialized.getResults().getNumFound());
assertEquals(qr.getResults().size(), deserialized.getResults().size());
assertNotNull(deserialized.getExplainMap());
assertEquals(qr.getExplainMap().size(),
deserialized.getExplainMap().size());
}{noformat}
> Java serialization broken for QueryResponse - SimpleOrderedMap implements Map
> breaks ObjectOutputStream
> --------------------------------------------------------------------------------------------------------
>
> Key: SOLR-18196
> URL: https://issues.apache.org/jira/browse/SOLR-18196
> Project: Solr
> Issue Type: Bug
> Components: clients - java
> Affects Versions: 10.0
> Environment: Client using SolrJ on Mac OS using Java 21. Solr
> instances running in AWS on EC2 instances.
> Reporter: Geoffrey Slinker
> Priority: Major
>
> Bug Report: Java Serialization Broken for QueryResponse in SolrJ 10.0.0
> Summary
> -------
> org.apache.solr.client.solrj.response.QueryResponse declares "implements
> Serializable" (inherited from SolrResponse) but cannot be serialized using
> Java's ObjectOutputStream in SolrJ 10.0.0. This is a regression from SolrJ
> 9.x where Java serialization worked correctly.
> Affected Version
> ----------------
> SolrJ 10.0.0
> Steps to Reproduce
> ------------------
> 1. Obtain a QueryResponse from any SolrClient.query() call.
> 2. Attempt to serialize it with ObjectOutputStream:
> QueryResponse response = solrClient.query("collection", query,
> SolrRequest.METHOD.POST);
> ByteArrayOutputStream baos = new ByteArrayOutputStream();
> ObjectOutputStream oos = new ObjectOutputStream(baos);
> oos.writeObject(response); // FAILS
> Expected Behavior
> -----------------
> The QueryResponse object should serialize successfully, as it did in SolrJ
> 9.x. The class hierarchy declares Serializable:
> SolrResponse implements Serializable (with serialVersionUID)
> SolrResponseBase extends SolrResponse
> QueryResponse extends SolrResponseBase
> Actual Behavior
> ---------------
> Serialization fails with:
> java.lang.NoSuchFieldException: serialPersistentFields
> The exception is thrown during ObjectOutputStream.writeObject() when Java's
> serialization mechanism attempts to introspect the class hierarchy.
> Root Cause
> ----------
> In Solr 10.0.0, SimpleOrderedMap was changed to implement java.util.Map as
> part of SIP-22 (NamedList Reduction):
> SolrJ 9.x: public class SimpleOrderedMap<T> extends NamedList<T>
> SolrJ 10.0: public class SimpleOrderedMap<T> extends NamedList<T>
> implements Map<String, T>
> QueryResponse internally contains a NamedList (via
> SolrResponseBase.response), which at runtime is a SimpleOrderedMap. When
> Java's ObjectOutputStream walks the class hierarchy of SimpleOrderedMap to
> build serialization metadata, it encounters the Map interface and attempts to
> locate serialPersistentFields on the class. This introspection fails with
> NoSuchFieldException, which causes serialization to fail.
> Impact
> ------
> Any code that relies on Java serialization of QueryResponse (or any
> SolrResponse subclass containing SimpleOrderedMap instances) is broken. This
> includes:
> - Caching serialized Solr responses
> - Storing Solr responses for test fixtures
> - Any framework that serializes Serializable objects (session replication,
> distributed caches, etc.)
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]