[ 
https://issues.apache.org/jira/browse/IGNITE-28301?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Aleksandr Polovtsev updated IGNITE-28301:
-----------------------------------------
    Description: 
h3. Summary                                                                     
                                                                                
                            
                                                                                
                                                                                
                           
  UOS (User Object Serialization) incorrectly sends class descriptors for all 
declared field types of                                                         
                               
  `Externalizable` classes, even though the `Externalizable` contract 
explicitly delegates serialization                                              
                                       
  to `writeExternal()`/`readExternal()`. Field types are irrelevant to the wire 
format — only what the                                                          
                             
  implementation explicitly writes matters.                                     
                                                                                
                           
                                                                                
                                                                                
                             
h3. Problem                                                                     
                                                                                
                          

  When UOS encounters an `Externalizable` class, it collects and sends 
descriptors for all its field                                                   
                                      
  types, even if those fields are never written to the stream via 
`writeExternal()`. This is incorrect
  because:                                                                      
                                                                                
                             
                                                                                
                                                                                
                           
  - `Externalizable` classes are fully responsible for their own serialization 
format                                                                          
                              
  - Field type descriptors add unnecessary overhead to the wire protocol        
                                                                                
                           
  - Sending descriptors for field types that are not part of the serialized 
form creates a hard                                                             
                                 
    dependency on those types being present on the receiving node, even if they 
are never actually                                                              
                             
    transmitted                                                                 
                                                                                
                             
                                                                                
                                                                                
                             
h3. Example                                                                     
                                                                                
                            
                                                                                
                                                                                
                             
  `io.scalecube.cluster.Member` implements `Externalizable`. Its 
`writeExternal()` writes the address                                            
                                            
  as a plain UTF string — not as a Java object. However, UOS sends a descriptor 
for the field's
  declared type (`io.scalecube.net.Address`) anyway. Any node that cannot 
resolve `Address` fails to                                                      
                                   
  register the `Member` descriptor, which causes an `IllegalStateException` 
during deserialization.                                                         
                                 
                                                                                
                                                                                
                             
h3. Expected Behavior                                                           
                                                                                
                            
                                                                                
                                                                                
                             
  UOS should not send class descriptors for field types of `Externalizable` 
classes. Descriptor                                                             
                                 
  collection for such classes should be limited to types that are explicitly 
written as objects in                                                           
                              
  `writeExternal()`, not inferred from field declarations.  

  was:
  ## Summary                                                                    
                                                                                
                             
                                                                                
                                                                                
                           
  UOS (User Object Serialization) incorrectly sends class descriptors for all 
declared field types of                                                         
                               
  `Externalizable` classes, even though the `Externalizable` contract 
explicitly delegates serialization                                              
                                       
  to `writeExternal()`/`readExternal()`. Field types are irrelevant to the wire 
format — only what the                                                          
                             
  implementation explicitly writes matters.                                     
                                                                                
                           
                                                                                
                                                                                
                             
  ## Problem                                                                    
                                                                                
                           

  When UOS encounters an `Externalizable` class, it collects and sends 
descriptors for all its field                                                   
                                      
  types, even if those fields are never written to the stream via 
`writeExternal()`. This is incorrect
  because:                                                                      
                                                                                
                             
                                                                                
                                                                                
                           
  - `Externalizable` classes are fully responsible for their own serialization 
format                                                                          
                              
  - Field type descriptors add unnecessary overhead to the wire protocol        
                                                                                
                           
  - Sending descriptors for field types that are not part of the serialized 
form creates a hard                                                             
                                 
    dependency on those types being present on the receiving node, even if they 
are never actually                                                              
                             
    transmitted                                                                 
                                                                                
                             
                                                                                
                                                                                
                             
  ## Example                                                                    
                                                                                
                             
                                                                                
                                                                                
                             
  `io.scalecube.cluster.Member` implements `Externalizable`. Its 
`writeExternal()` writes the address                                            
                                            
  as a plain UTF string — not as a Java object. However, UOS sends a descriptor 
for the field's
  declared type (`io.scalecube.net.Address`) anyway. Any node that cannot 
resolve `Address` fails to                                                      
                                   
  register the `Member` descriptor, which causes an `IllegalStateException` 
during deserialization.                                                         
                                 
                                                                                
                                                                                
                             
  ## Expected Behavior                                                          
                                                                                
                             
                                                                                
                                                                                
                             
  UOS should not send class descriptors for field types of `Externalizable` 
classes. Descriptor                                                             
                                 
  collection for such classes should be limited to types that are explicitly 
written as objects in                                                           
                              
  `writeExternal()`, not inferred from field declarations.  


> UOS: do not sent unneeded class descriptors for Externalizable classes
> ----------------------------------------------------------------------
>
>                 Key: IGNITE-28301
>                 URL: https://issues.apache.org/jira/browse/IGNITE-28301
>             Project: Ignite
>          Issue Type: Improvement
>            Reporter: Aleksandr Polovtsev
>            Priority: Major
>              Labels: ignite-3
>
> h3. Summary                                                                   
>                                                                               
>                                 
>                                                                               
>                                                                               
>                                
>   UOS (User Object Serialization) incorrectly sends class descriptors for all 
> declared field types of                                                       
>                                  
>   `Externalizable` classes, even though the `Externalizable` contract 
> explicitly delegates serialization                                            
>                                          
>   to `writeExternal()`/`readExternal()`. Field types are irrelevant to the 
> wire format — only what the                                                   
>                                     
>   implementation explicitly writes matters.                                   
>                                                                               
>                                
>                                                                               
>                                                                               
>                                  
> h3. Problem                                                                   
>                                                                               
>                               
>   When UOS encounters an `Externalizable` class, it collects and sends 
> descriptors for all its field                                                 
>                                         
>   types, even if those fields are never written to the stream via 
> `writeExternal()`. This is incorrect
>   because:                                                                    
>                                                                               
>                                  
>                                                                               
>                                                                               
>                                
>   - `Externalizable` classes are fully responsible for their own 
> serialization format                                                          
>                                               
>   - Field type descriptors add unnecessary overhead to the wire protocol      
>                                                                               
>                                
>   - Sending descriptors for field types that are not part of the serialized 
> form creates a hard                                                           
>                                    
>     dependency on those types being present on the receiving node, even if 
> they are never actually                                                       
>                                     
>     transmitted                                                               
>                                                                               
>                                  
>                                                                               
>                                                                               
>                                  
> h3. Example                                                                   
>                                                                               
>                                 
>                                                                               
>                                                                               
>                                  
>   `io.scalecube.cluster.Member` implements `Externalizable`. Its 
> `writeExternal()` writes the address                                          
>                                               
>   as a plain UTF string — not as a Java object. However, UOS sends a 
> descriptor for the field's
>   declared type (`io.scalecube.net.Address`) anyway. Any node that cannot 
> resolve `Address` fails to                                                    
>                                      
>   register the `Member` descriptor, which causes an `IllegalStateException` 
> during deserialization.                                                       
>                                    
>                                                                               
>                                                                               
>                                  
> h3. Expected Behavior                                                         
>                                                                               
>                                 
>                                                                               
>                                                                               
>                                  
>   UOS should not send class descriptors for field types of `Externalizable` 
> classes. Descriptor                                                           
>                                    
>   collection for such classes should be limited to types that are explicitly 
> written as objects in                                                         
>                                 
>   `writeExternal()`, not inferred from field declarations.  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to