让Dicionary<TKey,TValue>实现xml序列化与反序列化--继承IXmlSerializerable接口

使用XmlSerializer类来对自定义类进行序列化与反序列化存在一个问题,这个问题就是它不能序列化与反序列化,类型为Dicionary<TKey,TValue>的成员。

我设计了一个类叫做SerializerDictionay<TKey, TValue>,这个类即实现了Dictionay的所有功能,也能让其可以进行XML序列化与反序列化。

**核心思想:继承IXmlSerializerable接口,继承Dictionay<TKey, TValue>类
**

using System.Collections.Generic;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
public class SerializerDictionay<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable
{
    public XmlSchema GetSchema()
    {
        //用于返回结果的方法 直接返回null即可
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
        //跳过根节点头部
        reader.Read();
        //键翻译机器
        XmlSerializer xsKey = new XmlSerializer(typeof(TKey));
        //值翻译机器
        XmlSerializer xsValue = new XmlSerializer(typeof(TValue));
        //判断当前不是元素节点 就进行反序列化
        while(reader.NodeType!=XmlNodeType.Element)
        {
            //反序列化键
            TKey key = (TKey)xsKey.Deserialize(reader);
            //反序列化值
            TValue value = (TValue)xsValue.Deserialize(reader);
            //存储到字典中
            this.Add(key, value);
        }
        //跳过根节点的尾部
        reader.Read();
    }

    public void WriteXml(XmlWriter writer)
    {
        //键翻译机器
        XmlSerializer xsKey = new XmlSerializer(typeof(TKey));
        //值翻译机器
        XmlSerializer xsValue = new XmlSerializer(typeof(TValue));
        
        //迭代器遍历,将键和值依次序列化
        foreach(KeyValuePair<TKey,TValue> kv in this)
        {
            xsKey.Serialize(writer, kv.Key);
            xsValue.Serialize(writer, kv.Value);
        }
    }
}

测试:

using System.IO;
using System.Xml.Serialization;
using UnityEngine;

public class TestLession4
{
    public int test4;
    public SerializerDictionay<int, string> dic;
}
public class Lession4 : MonoBehaviour
{
    void Start()
    {
        //序列化测试
        TestLession4 tl4 = new TestLession4();
        tl4.dic = new SerializerDictionay<int, string>();
        tl4.dic.Add(1, "111");
        tl4.dic.Add(2, "222");
        tl4.dic.Add(3, "333");
        string path = Application.persistentDataPath + "/TestLession4.xml";
        //输出路径方便查看 序列化好的xml文件
        print(path);
        using (StreamWriter sw = new StreamWriter(path))
        {
            XmlSerializer xr = new XmlSerializer(typeof(TestLession4));
            xr.Serialize(sw, tl4);
        }

        //反序列化测试
        using (StreamReader sr = new StreamReader(path))
        {
            XmlSerializer xs = new XmlSerializer(typeof(TestLession4));
            //Deserialize()方法返回值为object 里氏替换成TestLession4类型
            tl4= xs.Deserialize(sr)as TestLession4;
        }
    }
}

结果截图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面这段代码的作用是什么def setup_model(self): self.enumerate_unique_labels_and_targets() self.model = CasSeqGCN(self.args, self.number_of_features + self.args.number_of_hand_features, self.number_of_nodes) #给当前类中模型主体进行初始化,初始化为上面的模型 def create_batches(self): N = len(self.graph_paths) train_start, valid_start, test_start = \ 0, int(N * self.args.train_ratio), int(N * (self.args.train_ratio + self.args.valid_ratio)) train_graph_paths = self.graph_paths[0:valid_start] valid_graph_paths = self.graph_paths[valid_start:test_start] test_graph_paths = self.graph_paths[test_start: N] self.train_batches, self.valid_batches, self.test_batches = [], [], [] for i in range(0, len(train_graph_paths), self.args.batch_size): self.train_batches.append(train_graph_paths[i:i+self.args.batch_size]) for j in range(0, len(valid_graph_paths), self.args.batch_size): self.valid_batches.append(valid_graph_paths[j:j+self.args.batch_size]) for k in range(0, len(test_graph_paths), self.args.batch_size): self.test_batches.append(test_graph_paths[k:k+self.args.batch_size]) def create_data_dictionary(self, edges, features): """ creating a data dictionary :param target: target vector :param edges: edge list tensor :param features: feature tensor :return: """ to_pass_forward = dict() to_pass_forward["edges"] = edges to_pass_forward["features"] = features return to_pass_forward def create_target(self, data): """ Target createn based on data dicionary. :param data: Data dictionary. :return: Target size """ return torch.tensor([data['activated_size']])
05-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值