Java Firestore在检索类时崩溃,请求空构造函数,但已经有一个构造函数
这一行:Java Firestore在检索类时崩溃,请求空构造函数,但已经有一个构造函数,java,android,google-cloud-firestore,Java,Android,Google Cloud Firestore,这一行: ProjectMap m = document.toObject(ProjectMap.class); 生成错误: E/AndroidRuntime:致命异常:主 进程:com.dockdogs.lorecords,PID:5633 java.lang.RuntimeException:无法反序列化对象。类com.dockdogs.lorecords.preferences.MapPreference$Bubble未定义无参数构造函数。如果您使用的是ProGuard,请确保未剥离这些
ProjectMap m = document.toObject(ProjectMap.class);
生成错误:
E/AndroidRuntime:致命异常:主
进程:com.dockdogs.lorecords,PID:5633
java.lang.RuntimeException:无法反序列化对象。类com.dockdogs.lorecords.preferences.MapPreference$Bubble未定义无参数构造函数。如果您使用的是ProGuard,请确保未剥离这些构造函数(在“preferences.mapBubble”字段中找到)
位于com.google.firebase.firestore.util.CustomClassMapper.deserializeError(CustomClassMapper.java:563)
在com.google.firebase.firestore.util.CustomClassMapper.access$200(CustomClassMapper.java:54)
在com.google.firebase.firestore.util.CustomClassMapper$BeanMapper.deserialize上(CustomClassMapper.java:749)
在com.google.firebase.firestore.util.CustomClassMapper$BeanMapper.deserialize上(CustomClassMapper.java:741)
位于com.google.firebase.firestore.util.CustomClassMapper.convertBean(CustomClassMapper.java:542)
位于com.google.firebase.firestore.util.CustomClassMapper.deserializeToClass(CustomClassMapper.java:253)
位于com.google.firebase.firestore.util.CustomClassMapper.DeserializeType(CustomClassMapper.java:189)
在com.google.firebase.firestore.util.CustomClassMapper.access$300(CustomClassMapper.java:54)
在com.google.firebase.firestore.util.CustomClassMapper$BeanMapper.deserialize上(CustomClassMapper.java:778)
在com.google.firebase.firestore.util.CustomClassMapper$BeanMapper.deserialize上(CustomClassMapper.java:741)
位于com.google.firebase.firestore.util.CustomClassMapper.convertBean(CustomClassMapper.java:542)
位于com.google.firebase.firestore.util.CustomClassMapper.deserializeToClass(CustomClassMapper.java:253)
位于com.google.firebase.firestore.util.CustomClassMapper.DeserializeType(CustomClassMapper.java:189)
在com.google.firebase.firestore.util.CustomClassMapper.access$300(CustomClassMapper.java:54)
在com.google.firebase.firestore.util.CustomClassMapper$BeanMapper.deserialize上(CustomClassMapper.java:770)
在com.google.firebase.firestore.util.CustomClassMapper$BeanMapper.deserialize上(CustomClassMapper.java:741)
位于com.google.firebase.firestore.util.CustomClassMapper.convertBean(CustomClassMapper.java:542)
位于com.google.firebase.firestore.util.CustomClassMapper.deserializeToClass(CustomClassMapper.java:253)
位于com.google.firebase.firestore.util.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:100)
位于com.google.firebase.firestore.DocumentSnapshot.toObject(DocumentSnapshot.java:183)
在com.google.firebase.firestore.QueryDocumentSnapshot.toObject(QueryDocumentSnapshot.java:116)上
位于com.google.firebase.firestore.DocumentSnapshot.toObject(DocumentSnapshot.java:161)
在com.google.firebase.firestore.QueryDocumentSnapshot.toObject(QueryDocumentSnapshot.java:97)上
位于com.dockdogs.lorecords.SaveSystem$26.onComplete(SaveSystem.java:488)
在com.google.android.gms.tasks.zzj.run上(com.google.android.gms:play services tasks@@17.2.0:4)
位于android.os.Handler.handleCallback(Handler.java:938)
位于android.os.Handler.dispatchMessage(Handler.java:99)
位于android.os.Looper.loop(Looper.java:246)
位于android.app.ActivityThread.main(ActivityThread.java:8512)
位于java.lang.reflect.Method.invoke(本机方法)
位于com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
ProjectMap看起来就像:
public class ProjectMap implements Serializable {
public int height=0;
public int width=0;
public String id = "";
public int scaleRatio = 1; //FOR ZOOMING THE MAP IN AND OUT
public String mapTitle, mapPath; //map path = image path
public boolean ISCURRENT = false; //the map that's currently being used by the user
public ArrayList<MapEvent> mapEvents = new ArrayList<MapEvent>();
private MapPreference preferences = new MapPreference();
}
public class MapPreference implements Serializable {
//Controls scale for map bitmap
public float minScaleX = 0.50f;
public float maxScaleX = 8f;
public float minScaleY = 0.50f;
public float maxScaleY = 8f;
//end controls for scaling map bitmap
public Dagger mapDagger = new Dagger();
public Bubble mapBubble = new Bubble();
public boolean useGridLines = true;
public int gridCols = 0;
public int gridRows = 0;
public MapPreference() {
}
public void setGridRows(int gridRows) { this.gridRows = gridRows; }
public void setGridCols(int gridCols) { this.gridCols = gridCols; }
//will the user have grid lines on their map?
public void setUseGridLines(boolean useGridLines) { this.useGridLines = useGridLines; }
public boolean GetUseGridLines() { return useGridLines; }
public int GetGridCols(){
return gridCols;
}
public int GetGridRows(){
return gridRows;
}
public float GetMinScaleX(){
return minScaleX;
}
public float GetMinScaleY(){
return minScaleY;
}
public float GetMaxScaleX(){
return maxScaleX;
}
public float GetMaxScaleY(){
return maxScaleY;
}
//TODO: add a preferences page for these options
public void SetMinScaleX(float _minScaleX){
minScaleX = _minScaleX;
}
public void SetMinScaleY(float _minScaleY){
minScaleY = _minScaleY;
}
public void SetMaxScaleX(float _maxScaleX){
maxScaleX = _maxScaleX;
}
public void SetMaxScaleY(float _maxScaleY){
maxScaleY = _maxScaleY;
}
public class Dagger implements Serializable {
public float minScaleX = 0.75f;
public float maxScaleX = 1f;
public float minScaleY = 0.75f;
public float maxScaleY = 1f;
public float GetMinScaleX(){
return minScaleX;
}
public float GetMinScaleY(){
return minScaleY;
}
public float GetMaxScaleX(){
return maxScaleX;
}
public float GetMaxScaleY(){
return maxScaleY;
}
//TODO: add a preferences page for these options
public void SetMinScaleX(float _minScaleX){
minScaleX = _minScaleX;
}
public void SetMinScaleY(float _minScaleY){
minScaleY = _minScaleY;
}
public void SetMaxScaleX(float _maxScaleX){
maxScaleX = _maxScaleX;
}
public void SetMaxScaleY(float _maxScaleY){
maxScaleY = _maxScaleY;
}
public Dagger(){
}
}
public class Bubble implements Serializable {
public float minScaleX = 0.75f;
public float maxScaleX = 1f;
public float minScaleY = 0.75f;
public float maxScaleY = 1f;
public float GetMinScaleX(){
return minScaleX;
}
public float GetMinScaleY(){
return minScaleY;
}
public float GetMaxScaleX(){
return maxScaleX;
}
public float GetMaxScaleY(){
return maxScaleY;
}
//TODO: add a preferences page for these options
public void SetMinScaleX(float _minScaleX){
minScaleX = _minScaleX;
}
public void SetMinScaleY(float _minScaleY){
minScaleY = _minScaleY;
}
public void SetMaxScaleX(float _maxScaleX){
maxScaleX = _maxScaleX;
}
public void SetMaxScaleY(float _maxScaleY){
maxScaleY = _maxScaleY;
}
public Bubble() {
}
}
}
我想知道是否使用Firestore无法正确检索浮动,但如果这是真的,我不确定我能做些什么
此外,这不是一个重复的问题,因为该类已经有一个空构造函数,它仍然抛出错误。这些类中的一些类似乎是其他类的内部类。在这种情况下,还需要将内部类标记为
static
。否则,默认构造函数将需要Firestore无法为您填充的隐式outer
参数
因此:
另请参见(对于实时数据库,但逻辑相同):
static public class Bubble ...