0

嗨,伙计们,我正在尝试打包嵌套对象,但它给出了 RuntimeException: Parcel: unable to marshal value....

请帮我解决这个问题...

包裹和pojo结构:-

只是显示pojo中的变量..

1)费率规则:-

public class RateRule{
    private List<Rule> rules = new ArrayList<Rule>();
 }

2) 规则:-

 public class Rule {
    private String ruleID;
    private String splOfferId;
    private String ruleName;
    private String ruleDescription; 
    private String ruleType;
    private List<Room> rooms = new ArrayList<Room>();
 }

3) 房间:-

    public class Room {
        private int id; 
        private String name; 
        private String propertyName;
        private String roomThumbnailUrl; 
        private String hotelInfo;
        private float price; 
        private float discountPrice;
        private String roomTypeId;
        private String maxOccupancy; 
        private List<String> amenities = new ArrayList<String>();   
        private List<String> facilities = new ArrayList<String>(); 
        private List<Gallery> gallery = new ArrayList<Gallery>(); 
        private List<String> tvChannels = new ArrayList<String>();
        private List<String> attractions = new ArrayList<String>();
   }

----------- 可读写的 Parcelable 类:-

public class RateRuleParcel  implements Parcelable {
    private RateRule rateRule;

    public RateRule getRateRule() {
        return rateRule;
    }

    public RateRuleParcel(RateRule rateRule) {
        super();
        this.rateRule = rateRule;
    }
    public RateRuleParcel(Parcel in) {
        rateRule=new RateRule();
        ArrayList<Rule> readArrayList = (ArrayList<Rule>)in.readArrayList(Object.class.getClassLoader());
        rateRule.setRules(readArrayList);
    }
    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        // TODO Auto-generated method stub
         dest.writeList((ArrayList<Rule>)rateRule.getRules());

    }
    public static final Parcelable.Creator<RateRuleParcel> CREATOR = new Parcelable.Creator<RateRuleParcel>() {

        @Override
        public RateRuleParcel createFromParcel(Parcel in) {
            return new RateRuleParcel(in);
        }

        @Override
        public RateRuleParcel[] newArray(int size) {
            return new RateRuleParcel[size];
        }

    };

}

以及我试图在包裹中设置 vales 的课程:-

List<Room> roomItem;    List<Rule> ruleItem;    List<Rule> rateRuleItem; RateRule rateRule = new RateRule();

            Rule rule= new Rule();
            Room room= new Room();
            ruleItem=new ArrayList<Rule>();
            roomItem=new ArrayList<Room>();
            rateRuleItem=new ArrayList<Rule>();
            rule.setRuleID(rateRuleIdArray.get(groupPosition));
            rule.setSplOfferId(splOfferId);
            rule.setRuleName("TESTING");
            rule.setRuleDescription("TESTING");
            rule.setRuleType(rateRuleTypeArray.get(groupPosition));

            room.setId(Integer.parseInt(setId.get(childPosition)));
            room.setName(setName.get(childPosition).toString());
            room.setPropertyName(propertyName);
            room.setRoomThumbnailUrl("TESTING");
            room.setHotelInfo(setHotelInfo.get(childPosition).toString());
            room.setPrice(Float.parseFloat(setPrice.get(childPosition).toString()));
            room.setDiscountPrice(Float.parseFloat(setDiscountPrice.get(childPosition).toString()));
        //  ruleItem.add(rule);
            roomItem.add(room);
            rule.setRooms(roomItem); 
            rateRuleItem.add(rule);
            rateRule.setRules(rateRuleItem);
4

1 回答 1

2

将包裹视为一个递归过程。给定一个实现接口的任意对象,Parcelableparcel 进程调用object.writeToParcel(). 再次在此方法中,您需要对对象的所有字段进行打包,它们要么是本机可打包类型(int、bool、String、List,...),要么是可打包的。如果它们是 parcelables,writeToParcel()则在它们上调用该方法。这样做直到在每个递归分支中都达到本机可打包类型。

看看你的代码,dest.writeList((ArrayList<Rule>)rateRule.getRules());你依赖于这样一个事实,即有一个方法似乎将一个列表写入一个包裹。但是有一个前提条件是列表元素的类型又是parcelable,这里不是这样。你需要使Ruleparcelable,因此你需要使Roomparcelable,因此你需要使Galeryparcelable,......

通常,查看您要打包的类,然后自上而下检查每个字段的类是否已经可打包。

于 2014-02-28T08:37:27.317 回答