XmlSerializer_源码学习

MetricsXmlSerializer

package com.android.compatibility.common.util;

import org.xmlpull.v1.XmlSerializer;

import java.io.IOException;
import java.util.List;

/**
 * Serialize Metric data from {@link ReportLog} into compatibility report friendly XML
 */
public final class MetricsXmlSerializer {

    private final XmlSerializer mXmlSerializer;

    public MetricsXmlSerializer(XmlSerializer xmlSerializer) {
        this.mXmlSerializer = xmlSerializer;
    }

    public void serialize(ReportLog reportLog) throws IOException {
        if (reportLog == null) {
            return;
        }
        ReportLog.Result summary = reportLog.getSummary();
        List<ReportLog.Result> detailedMetrics = reportLog.getDetailedMetrics();
        // <Summary message="Average" scoreType="lower_better" unit="ms">195.2</Summary>
        if (summary != null) {
            mXmlSerializer.startTag(null, "Summary");
            mXmlSerializer.attribute(null, "message", summary.getMessage());
            mXmlSerializer.attribute(null, "scoreType", summary.getType().getXmlString());
            mXmlSerializer.attribute(null, "unit", summary.getUnit().getXmlString());
            mXmlSerializer.text(Double.toString(summary.getValues()[0]));
            mXmlSerializer.endTag(null, "Summary");
        }

        if (!detailedMetrics.isEmpty()) {
            mXmlSerializer.startTag(null, "Details");
            for (ReportLog.Result result : detailedMetrics) {
                mXmlSerializer.startTag(null, "ValueArray");
                mXmlSerializer.attribute(null, "source", result.getLocation());
                mXmlSerializer.attribute(null, "message", result.getMessage());
                mXmlSerializer.attribute(null, "scoreType", result.getType().getXmlString());
                mXmlSerializer.attribute(null, "unit", result.getUnit().getXmlString());

                for (double value : result.getValues()) {
                    mXmlSerializer.startTag(null, "Value");
                    mXmlSerializer.text(Double.toString(value));
                    mXmlSerializer.endTag(null, "Value");
                }
                mXmlSerializer.endTag(null, "ValueArray");
            }
            mXmlSerializer.endTag(null, "Details");
        }
    }
}

测试代码

package com.android.compatibility.common.util;

import junit.framework.TestCase;

import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

/**
 * Unit tests for {@link MetricsXmlSerializer}
 */
public class MetricsXmlSerializerTest extends TestCase {

    static class LocalReportLog extends ReportLog {}
    private static final double[] VALUES = new double[] {1, 11, 21, 1211, 111221};
    private static final String HEADER = "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>";
    private static final String EXPECTED_XML =
            HEADER
            + "<Summary message=\"Sample\" scoreType=\"higher_better\" unit=\"byte\">1.0</Summary>"
            + "<Details>"
                    + "<ValueArray source=\"sun.reflect.NativeMethodAccessorImpl#invoke0:-2\""
                    + " message=\"Details\" scoreType=\"neutral\" unit=\"fps\">"
                        + "<Value>1.0</Value>"
                        + "<Value>11.0</Value>"
                        + "<Value>21.0</Value>"
                        + "<Value>1211.0</Value>"
                        + "<Value>111221.0</Value>"
                    + "</ValueArray>"
            + "</Details>";

    private LocalReportLog mLocalReportLog;
    private MetricsXmlSerializer mMetricsXmlSerializer;
    private ByteArrayOutputStream mByteArrayOutputStream;
    private XmlSerializer xmlSerializer;

    @Override
    public void setUp() throws Exception {
        mLocalReportLog = new LocalReportLog();
        mByteArrayOutputStream = new ByteArrayOutputStream();
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance(null, null);
        xmlSerializer = factory.newSerializer();
        xmlSerializer.setOutput(mByteArrayOutputStream, "utf-8");

        this.mMetricsXmlSerializer = new MetricsXmlSerializer(xmlSerializer);
    }

    public void testSerialize_null() throws IOException {
        xmlSerializer.startDocument("utf-8", true);
        mMetricsXmlSerializer.serialize(null);
        xmlSerializer.endDocument();

        assertEquals(HEADER.length(), mByteArrayOutputStream.toByteArray().length);
    }

    public void testSerialize_noData() throws IOException {
        xmlSerializer.startDocument("utf-8", true);
        mMetricsXmlSerializer.serialize(mLocalReportLog);
        xmlSerializer.endDocument();

        assertEquals(HEADER.length(), mByteArrayOutputStream.toByteArray().length);
    }

    public void testSerialize() throws IOException {
        mLocalReportLog.setSummary("Sample", 1.0, ResultType.HIGHER_BETTER, ResultUnit.BYTE);
        mLocalReportLog.addValues("Details", VALUES, ResultType.NEUTRAL, ResultUnit.FPS);

        xmlSerializer.startDocument("utf-8", true);
        mMetricsXmlSerializer.serialize(mLocalReportLog);
        xmlSerializer.endDocument();

        assertEquals(EXPECTED_XML, mByteArrayOutputStream.toString("utf-8"));
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值