[ 
https://issues.apache.org/jira/browse/SOLR-18196?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18077226#comment-18077226
 ] 

Mikhail Khludnev commented on SOLR-18196:
-----------------------------------------

I haven't heard there are contract for Java's serialization for SolrJ and 
others', just because Solr has own javabin serialization format. Maybe I miss 
something. So, I suppose it was a de facto never guarantee behavior, which were 
legally dropped in the next major release. It's sad, but that's it. 

> 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]

Reply via email to