C#【必备技能篇】序列化与反序列化(json、xml、二进制文件)

news2024/11/28 2:33:03

文章目录

  • 一、序列化为json
    • 1、序列化与反序列化【基本使用】
      • 实例代码:
    • 2、封装成泛型方法【可以公用】
      • 实例代码:
  • 二、序列化为xml
    • 1、序列化与反序列化【基本使用】
      • 实例代码:
    • 2、封装成泛型方法【可以公用】
      • 实例代码:
  • 三、序列化为二进制文件
    • 1、序列化与反序列化【基本使用】
      • 实例代码:
    • 2、封装成泛型方法【可以公用】
      • 实例代码:
    • 3、补充【项目中实际代码,供参考】
  • 参考:

序列化是把一个内存中的对象的信息转化成一个可以持久化保存的形式,以便于保存或传输,序列化的主要作用是不同平台之间进行通信,常用的有序列化有json、xml、二进制文件等,下面就逐个讲下这三种序列化的方法。

一、序列化为json

1、序列化与反序列化【基本使用】

C#中用于对象和json相互转换的原生类有两个:DataContractJsonSerializer和JavaScriptSerializer,其中JavaScriptSerializer主要用于web的浏览器和服务器之间的通信。
这里主要讲DataContractJsonSerializer的使用,要使用DataContractJsonSerializer,先要在项目中引用System.Runtime.Serialization。首先准备一个测试的类Book:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;//添加的引用
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    [DataContract]
    public class Book
    {
        [DataMember]
        public int ID { get; set; }

        [DataMember]
        public string Name { get; set; }

        [DataMember]
        public float Price { get; set; }
    }
}

[DataContract]指定该类型要定义或实现一个数据协定,并可由序列化程序(如 System.Runtime.Serialization.DataContractSerializer)进行序列化。
[DataMember]当应用于类型的成员时,指定该成员是数据协定的一部分并可由 System.Runtime.Serialization.DataContractSerializer进行序列化。

序列化:
然后先创建一个Book对象,实例化一个DataContractJsonSerializer实例,最后用该实例的WriteObject()方法将对象写到流中。

反序列化:
将一个json格式的字符串反序列化为对象是用DataContractJsonSerializer实例的ReadObject()方法。

实例代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Json;//添加的引用
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    public class Program
    {
        static void Main(string[] args)
        {
            //序列化json
            Book book = new Book() { ID = 101, Name = "C#程序设计", Price = 79.5f };
            DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(Book));
            using (MemoryStream stream = new MemoryStream())
            {
                formatter.WriteObject(stream, book);
                string result = System.Text.Encoding.UTF8.GetString(stream.ToArray());
                Console.WriteLine(result);
            }
            Console.WriteLine();

            //反序列化json
            string oriStr = "{\"ID\":102,\"Name\":\"C# wpf程序设计\",\"Price\":100}";
            DataContractJsonSerializer formatter1 = new DataContractJsonSerializer(typeof(Book));
            using (MemoryStream stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(oriStr)))
            {
                Book outBook = formatter1.ReadObject(stream) as Book;
                Console.WriteLine(outBook.ID);
                Console.WriteLine(outBook.Name);
                Console.WriteLine(outBook.Price);
            }
            Console.ReadLine();
        }
    }
}

在这里插入图片描述

2、封装成泛型方法【可以公用】

实例代码:

Program.cs【核心代码】

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {

            //【01】Book类
            Book book = new Book() { ID = 101, Name = "C#程序设计", Price = 79.5f };
            //序列化json
            string result = Serializer.ObjectToJson<Book>(book);
            Console.WriteLine(result);
            Console.WriteLine();


            //反序列化json
            string oriStr = "{\"ID\":101,\"Name\":\"C#程序设计\",\"Price\":79.5}";
            Book outBook = Serializer.JsonToObject<Book>(oriStr);
            Console.WriteLine(outBook.ID);
            Console.WriteLine(outBook.Name);
            Console.WriteLine(outBook.Price);
            Console.WriteLine();
            Console.WriteLine("——————————————————————");


            //【02】Student类
            Student student = new Student() { ID = 5, Name = "Star", Age = 30 };
            //序列化json
            string result1 = Serializer.ObjectToJson<Student>(student);
            Console.WriteLine(result1);
            Console.WriteLine();


            //反序列化json
            string oriStr1 = "{\"ID\":5,\"Name\":\"Star\",\"Age\":29}";
            Student outStudent = Serializer.JsonToObject<Student>(oriStr1);
            Console.WriteLine(outStudent.ID);
            Console.WriteLine(outStudent.Name);
            Console.WriteLine(outStudent.Age);

            Console.Read();
        }
    }

    public class Serializer
    {
        /// 将对象序列化为json文件
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="t">实例</param>
        /// <param name="path">存放路径</param>
        public static void ObjectToJson<T>(T t, string path) where T : class
        {
            DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(T));
            using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate))
            {
                formatter.WriteObject(stream, t);
            }
        }

        /// <summary>
        /// 将对象序列化为json字符串
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="t">实例</param>
        /// <returns>json字符串</returns>
        public static string ObjectToJson<T>(T t) where T : class
        {
            DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(T));
            using (MemoryStream stream = new MemoryStream())
            {
                formatter.WriteObject(stream, t);
                string result = System.Text.Encoding.UTF8.GetString(stream.ToArray());
                return result;
            }
        }

        /// <summary>
        /// json字符串转成对象
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="json">json格式字符串</param>
        /// <returns>对象</returns>
        public static T JsonToObject<T>(string json) where T : class
        {
            DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(T));
            using (MemoryStream stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(json)))
            {
                T result = formatter.ReadObject(stream) as T;
                return result;
            }
        }
    }
}

Book.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    [DataContract]
    public class Book
    {
        [DataMember]
        public int ID { get; set; }

        [DataMember]
        public string Name { get; set; }

        [DataMember]
        public float Price { get; set; }
    }
}

Student.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    [DataContract]
    public class Student
    {
        [DataMember]
        public int ID { get; set; }

        [DataMember]
        public string Name { get; set; }

        [DataMember]
        public int Age { get; set; }
    }
}

在这里插入图片描述

二、序列化为xml

C#中将对象序列化和反序列化为xml的类是XmlSerializer,要引用System.Xml.Serialization

1、序列化与反序列化【基本使用】

序列化:
先创建一个XmlSerializer对象实例,然后用实例的Serialize的方法将对象写入到文件流中。
当然也可以将对象转换成对象流,然后转换成xml格式的字符串。

反序列化:
将xml文件反序列化的方法是用XmlSerializer实例的Deserialize()方法

实例代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApp3
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Book book = new Book() { ID = 101, Name = "C#程序设计", Price = 79.5f };

            //[1]序列化
            XmlSerializer formatter = new XmlSerializer(typeof(Book));
            //保存为文件
            using (FileStream stream = new FileStream(@".\book.xml", FileMode.OpenOrCreate))
            {
                formatter.Serialize(stream, book);
            }
            //转换为xml格式的字符串
            using (MemoryStream stream = new MemoryStream())
            {
                formatter.Serialize(stream, book);
                string result = System.Text.Encoding.UTF8.GetString(stream.ToArray());//转换成xml字符串
                Console.WriteLine(result);
            }
            Console.WriteLine("——————————————————————");

            //[2]反序列化
            XmlSerializer formatter1 = new XmlSerializer(typeof(Book));
            using (FileStream stream = new FileStream(@".\book.xml", FileMode.OpenOrCreate))
            {
                XmlReader xmlReader = new XmlTextReader(stream);
                Book outBook = formatter.Deserialize(xmlReader) as Book;//反序列化
                Console.WriteLine(outBook.ID);
                Console.WriteLine(outBook.Name);
                Console.WriteLine(outBook.Price);
            }

            Console.Read();
        }
    }
}

在这里插入图片描述

2、封装成泛型方法【可以公用】

实例代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApp4
{
    class Program
    {
        static void Main(string[] args)
        {
            Book book = new Book() { ID = 101, Name = "C#程序设计", Price = 79.6f };

            //序列化xml
            Serializer.ObjectToXml(book, @".\book.xml");

            //反序列化xml
            Book outBook = Serializer.XmlToObject(book, @".\book.xml");
            Console.WriteLine(outBook.ID);
            Console.WriteLine(outBook.Name);
            Console.WriteLine(outBook.Price);
            Console.Read();
        }
    }

    public class Serializer
    {
        /// <summary>
        /// 将对象序列化为xml文件
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="t">对象</param>
        /// <param name="path">xml存放路径</param>
        public static void ObjectToXml<T>(T t, string path) where T : class
        {
            XmlSerializer formatter = new XmlSerializer(typeof(T));
            using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate))
            {
                formatter.Serialize(stream, t);
            }
        }

        /// <summary>
        /// 将对象序列化为xml字符串
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="t">对象</param>
        public static string ObjectToXml<T>(T t) where T : class
        {
            XmlSerializer formatter = new XmlSerializer(typeof(T));
            using (MemoryStream stream = new MemoryStream())
            {
                formatter.Serialize(stream, t);
                string result = System.Text.Encoding.UTF8.GetString(stream.ToArray());
                return result;
            }
        }

        /// <summary>
        /// 将xml文件反序列化为对象
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="t">对象</param>
        /// <param name="path">xml路径</param>
        /// <returns>对象</returns>
        public static T XmlToObject<T>(T t, string path) where T : class
        {
            XmlSerializer formatter = new XmlSerializer(typeof(T));
            using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate))
            {
                XmlReader xmlReader = new XmlTextReader(stream);
                T result = formatter.Deserialize(xmlReader) as T;
                return result;
            }
        }
    }
}

在这里插入图片描述

三、序列化为二进制文件

1、序列化与反序列化【基本使用】

C#中将对象序列化为二进制文件的类是BinaryFormatter,要引用System.Runtime.Serialization.Formatters.Binary

序列化:
先创建一个BinaryFormatter对象实例,然后用实例的Serialize的方法将对象写入到文件流中

反序列化:
可以通过BinaryFormatter类型实例的Deserialize()方法把二进制文本反序列化为对象

实例代码:

Program.cs:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp5
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Book book = new Book() { ID = 101, Name = "C#程序设计", Price = 79.5f };

            //序列化文件
            BinaryFormatter formatter = new BinaryFormatter();
            using (FileStream stream = new FileStream(@".\book.txt", FileMode.OpenOrCreate))
            {
                formatter.Serialize(stream, book);
            }

            //反序列化文件
            BinaryFormatter formatter1 = new BinaryFormatter();
            using (FileStream stream = new FileStream(@".\book.txt", FileMode.OpenOrCreate))
            {
                Book outBook = formatter1.Deserialize(stream) as Book;
                Console.WriteLine(outBook.ID);
                Console.WriteLine(outBook.Name);
                Console.WriteLine(outBook.Price);
            }
            Console.Read();
        }
    }
}

Book.cs:【注意下边是 : [Serializable]】

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp5
{
    [Serializable]
    public class Book
    {
        public int ID { get; set; }

        public string Name { get; set; }

        public float Price { get; set; }
    }
}

程序执行完成后产生bool.txt文件,如图:
在这里插入图片描述

在这里插入图片描述

2、封装成泛型方法【可以公用】

实例代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp6
{
    class Program
    {
        static void Main(string[] args)
        {
            Book book = new Book() { ID = 101, Name = "C#程序设计", Price = 79.5f };
            //序列化文件
            Serializer.ObjectToFile(book, @".\book.txt");

            //序列化为字符串
            string result = Serializer.ObjectToString<Book>(book);
            Console.WriteLine(result);//这里显示为乱码

            Console.WriteLine("——————————————————");

            //文件反序列化为类型
            Book outBook = Serializer.FileToObject<Book>(@".\book.txt") as Book;
            Console.WriteLine(outBook.ID);
            Console.WriteLine(outBook.Name);
            Console.WriteLine(outBook.Price);
            Console.WriteLine("——————————————————");

            //字符串反序列化为类型【测试失败,报异常:System.Runtime.Serialization.SerializationException:“没有对象“201326592”的映射。”】
            //Book outBook1 = Serializer.StringToObject<Book>(result);
            //Console.WriteLine(outBook1.ID);
            //Console.WriteLine(outBook1.Name);
            //Console.WriteLine(outBook1.Price);
            Console.Read();
        }
    }

    public class Serializer
    {
        /// <summary>
        /// 将对象序列化为字符串
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="t">实例</param>
        /// <returns>字符串</returns>
        public static string ObjectToString<T>(T t)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            using (MemoryStream stream = new MemoryStream())
            {
                formatter.Serialize(stream, t);
                string result = System.Text.Encoding.UTF8.GetString(stream.ToArray());
                return result;
            }
        }

        /// <summary>
        /// 将对象序列化为文件
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="t">实例</param>
        /// <param name="path">存放路径</param>
        public static void ObjectToFile<T>(T t, string path)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate))
            {
                formatter.Serialize(stream, t);
                stream.Flush();
            }
        }

        /// <summary>
        /// 将字符串反序列为类型
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="s">字符串</param>
        /// <returns>对象</returns>
        public static T StringToObject<T>(string s) where T : class
        {
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(s);
            BinaryFormatter formatter = new BinaryFormatter();
            using (MemoryStream stream = new MemoryStream(buffer))
            {
                T result = formatter.Deserialize(stream) as T;//报异常:System.Runtime.Serialization.SerializationException:“没有对象“201326592”的映射。”

                return result;
            }
        }

        /// <summary>
        /// 将文件反序列化为对象
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="path">路径</param>
        /// <returns>对象</returns>
        public static T FileToObject<T>(string path) where T : class
        {
            using (FileStream stream = new FileStream(path, FileMode.Open))
            {
                BinaryFormatter formatter = new BinaryFormatter();
                T result = formatter.Deserialize(stream) as T;
                return result;
            }
        }
    }
}

在这里插入图片描述

上边注释部分若释放,会报如下异常:【???】
在这里插入图片描述

3、补充【项目中实际代码,供参考】

在这里插入图片描述
序列化:保存为二进制文件
在这里插入图片描述
反序列化:打开一个二进制文件,并转换为类实例对象在这里插入图片描述

参考:

https://www.cnblogs.com/maitian-lf/p/3670570.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/331619.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows sshfs挂载远程文件夹

Windows sshfs挂载远程文件夹 Windows系统通过sshfs&#xff0c;远程挂载文件服务&#xff0c;实现远程文件夹共享的功能 目录 Windows sshfs挂载远程文件夹 1.安装WinFsp 2.安装SSHFS-Win 3.挂载Linux文件服务 4.断开Linux文件服务 1.安装WinFsp 下载地址&#xff1a;…

Vue3配置路由(vue-router)

文章目录前言一、配置路由&#xff08;vue-router&#xff09;1、安装路由2、新建页面3、创建路由配置文件4.特殊报错&#xff01;前言 紧接上篇文章&#xff0c;vue3的配置与vue2是有所差别的&#xff0c;本文就讲述了如何配置&#xff0c;如果本文对你有所帮助请三连支持博主…

2023-02-09 Elasticsearch 模糊搜索

1 prefix 前缀搜索 以前缀开头的搜索&#xff0c;不计算相关度得分 前缀搜索匹配的是term&#xff0c;而不是field。 前缀搜索的性能很差 前缀搜索没有缓存 前缀搜索尽可能把前缀长度设置的更长 针对于中文分词器 index_prefixes: 默认 “min_chars” : 2, “max_chars” : …

CMMI落地常见4大问题及改进措施

&#xff08;一&#xff09;、CMMI落地常见的4大问题&#xff1a; 1、组织成员并非全部认可与参与 在CMMI推行过程中&#xff0c;过程改进小组EPG负责整个改进工作&#xff0c;但组织其他成员并不是全部认可和自愿参与&#xff0c;甚至有些成员认为与自己无关。从而造成EPG在推…

Spring-Data-Jpa实现继承实体类

写在前面&#xff1a;从2018年底开始学习SpringBoot&#xff0c;也用SpringBoot写过一些项目。现在对学习Springboot的一些知识总结记录一下。如果你也在学习SpringBoot&#xff0c;可以关注我&#xff0c;一起学习&#xff0c;一起进步。 相关文章&#xff1a; 【Springboot系…

ZooKeeper 避坑实践: Zxid溢出导致选主

作者&#xff1a;子葵 背景 线上 flink 用户使用 ZooKeeper 做元数据中心以及集群选主&#xff0c;一些版本的 flink 在 ZooKeeper 选主时&#xff0c;会重启 Job&#xff0c;导致一些非预期的业务损失。而 ZooKeeper 在 zxid溢出时&#xff0c;会主动触发一次选主&#xff0…

复习0206

目录 一、访问修饰符 一、权限范围 二、注意事项 二、封装&#xff08;面向对象的三大特征之一&#xff09; 一、封装的好处 二、封装的实现步骤 三、和构造器结合 四、练习题中的细节 一、访问修饰符 一、权限范围 访问修饰符用于控制方法和属性&#xff08;成员变量…

Kylin构建引擎的衍生维度

目录1. 衍生维度(derived dimension)1. 衍生维度(derived dimension) 衍生维度的构建和查询过程&#xff1a; 当有一张事实表和维度表如下&#xff1a; 我们需要以city为维度字段&#xff0c;sum(salary)为度量字段&#xff0c;进行cube的构建。因为定义了city为衍生维度字段…

C++多态(上)

文章目录1. 多态的概念2. 多态的定义及实现2.1多态的构成条件2.2 虚函数2.3 虚函数的重写2.4 虚函数重写的两个例外2.4.1 协变(基类与派生类虚函数返回值类型不同)2.4.2 析构函数的重写(基类与派生类析构函数的名字不同)2.5 重载、覆盖(重写)、隐藏(重定义)的对比3. C11 overri…

小程序酷炫动态登录页源码(动态水滴)

1. 页面效果 登陆页面一般都要酷炫好看一点&#xff0c;这里分享一个动态登录页面&#xff0c;页面有三个流动的小水滴。一个水滴放登录框。剩下两个水滴跳转页面和打开弹窗。 2. 代码内容 <template><view class"login-page"><u-gap height"…

【c语言技能树】文件

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

JVM堆内存详解

一、简介 JAVA堆内存管理是影响性能主要因素之一。 堆内存溢出是JAVA项目非常常见的故障&#xff0c;在解决该问题之前&#xff0c;必须先了解下JAVA堆内存是怎么工作的。 JVM内存划分为堆内存和非堆内存&#xff0c;堆内存分为年轻代&#xff08;Young Generation&#xff09…

C语言基础(九)—— 复合类型(自定义类型)

1. 结构体1.1 概述数组&#xff1a;描述一组具有相同类型数据的有序集合&#xff0c;用于处理大量相同类型的数据运算。有时我们需要将不同类型的数据组合成一个有机的整体&#xff0c;如&#xff1a;一个学生有学号/姓名/性别/年龄/地址等属性。显然单独定义以上变量比较繁琐&…

ArkTS语法(声明式UI)

页面级变量的状态管理 装饰器装饰内容说明State基本数据类型&#xff0c;类&#xff0c;数组修饰的状态数据被修改时会触发组件的build方法进行UI界面更新。Prop基本数据类型修改后的状态数据用于在父组件和子组件之间建立单向数据依赖关系。修改父组件关联数据时&#xff0c;…

你真的看好低代码开发吗?

低代码开发前景如何&#xff0c;大家真的看好低代码开发吗&#xff1f;之前有过很多关于低代码的内容&#xff0c;这篇就来梳理下国内外低代码开发平台发展现状及前景。 01、国外低代码开发平台现状 2014年&#xff0c;研究机构Forrester Research发表的报告中提到“面向客户…

【Java基础】017 -- 面向对象进阶二(包、代码块、抽象类、接口、内部类)

目录 四、包和final 1、什么是包&#xff1f; 2、使用其它类的规则 ①、规则实现 ②、小结 3、final ①、示例代码 ②、常量 ③、练习 ④、小结 五、权限修饰符和代码块 1、权限修饰符的分类 2、权限修饰符的使用规则 3、代码块 ①、局部代码块&#xff08;写在…

对docker一部分问题的处理

对docker一部分问题的处理一、permission denied二、启动容器后又立即停止三、Error: Failed to download metadata for repo appstream: Cannot prepare internal mirrorlist: No URLs in mirrorlist一、permission denied 当要执行docker images 报错&#xff1a; Got permi…

iOS 变体包体构建

ipa变体安装包是指单设备架构单资源的下载包大小 变体包输出方案&#xff1a; 1、在xcode工程中Product->Archive 2、导出选择非Appstore方式&#xff0c;可选择Ad Hoc, Development, Enterprise 3、在用于设置开发分发选项的页面中&#xff0c;为 app 瘦身选取“All co…

第三章.神经网络的学习—梯度,手写数字识别2层神经网络的实现

第三章.神经网络的学习 3.2 梯度 梯度法使用梯度的信息决定前进的方向&#xff0c;在介绍梯度法之前&#xff0c;先介绍一下导数和偏导。 1.导数 1).公式&#xff1a; 2).代码实现&#xff1a; 注意&#xff1a; ①.h 1e-4不可以使用过小的值&#xff0c;会出现计算出错的问题…

室外定位靠卫星 室内定位又如何?

人类为了不让自己迷失在茫茫大自然中&#xff0c;先后发明罗盘、指南针等工具&#xff0c;卫星定位的问世&#xff0c;解决了“我在哪里”的问题。如今物联网是“信息化”时代的重要发展阶段&#xff0c;随着社会信息化水平的普遍提高&#xff0c;其社会的重要性日益显现。云计…