合適使用深度拷貝的一個場景包含簡單深度拷貝的示例代碼

来源:https://www.cnblogs.com/duwenlong/archive/2023/03/15/17219528.html
-Advertisement-
Play Games

背景 日常開發中,經常需要對一些響應不是很快的關鍵業務介面增加防重功能,即短時間內收到的多個相同的請求,只處理一個,其餘不處理,避免產生臟數據。這和冪等性(idempotency)稍微有點區別,冪等性要求的是對重覆請求有相同的效果和結果,通常需要在介面內部執行業務操作前檢查狀態;而防重可以認為是一個 ...


今天有一個場景需要用到對象的複製,寫個深度拷貝的代碼,做個記錄
在同一個業務中包含多處回調的場景下:有一個對象是處理業務邏輯的回調中使用,但是在其他回調函數中會清理這個對象;
出現了一個問題在處理業務邏輯的回調函數中,還沒有使用完,其他回調函數清空了這個對象,所有代碼中儘量不要用鎖,所以不考慮用鎖的情況

考慮到主要業務處理回調邏輯比較獨立;所以想到了2種方案,

  1. 線程內部對象
  2. 深度拷貝
    因為業務處理回調函數執行時間很短,又沒有等待邏輯,所以不合適使用線程池+線程內部對象的方式處理,所以在處理業務邏輯函數入口使用了對象的深度拷貝,保證了函數內部都使用的深度拷貝的對象;
    深度拷貝的示例代碼如下,留作備用:
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace DeepCopyExample
{
    [Serializable]
    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public Address Address { get; set; }

        public Person(string name, int age, Address address)
        {
            Name = name;
            Age = age;
            Address = address;
        }

        public Person DeepCopy()
        {
            using (MemoryStream stream = new MemoryStream())
            {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(stream, this);
                stream.Position = 0;
                return (Person)formatter.Deserialize(stream);
            }
        }
    }

    [Serializable]
    public class Address
    {
        public string City { get; set; }
        public string Country { get; set; }

        public Address(string city, string country)
        {
            City = city;
            Country = country;
        }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            Address address = new Address("Beijing", "China");
            Person person1 = new Person("duwenlong ", 31, address);
            Person person2 = person1.DeepCopy();
            Console.WriteLine($"Person1 Name: {person1.Name}, Age: {person1.Age}, City: {person1.Address.City}, Country: {person1.Address.Country}");
            Console.WriteLine($"Person2 Name: {person2.Name}, Age: {person2.Age}, City: {person2.Address.City}, Country: {person2.Address.Country}");

            Console.WriteLine("changed Person2 City to Henan");
            person2.Address.City = "Henan";

            Console.WriteLine($"Person1 Name: {person1.Name}, Age: {person1.Age}, City: {person1.Address.City}, Country: {person1.Address.Country}");
            Console.WriteLine($"Person2 Name: {person2.Name}, Age: {person2.Age}, City: {person2.Address.City}, Country: {person2.Address.Country}");

            Console.ReadKey();
        }
    }
}

觀察輸出Persion2的城市修改了,Persion1的沒有變化;


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • highlight: a11y-dark 簡介 前段時間寫了一個Chatgpt的Java版SDK開源地址:chatgpt-java歡迎使用。但由於原來OpenAI 並沒有支持官網的chatgpt模型,所以使用起來相對沒有官網那麼智能完善,所以就沒有寫出一個demo項目,只開源了Open AI的SDK ...
  • 實現SpringBoot底層機制 Tomcat底層啟動分析+Spring容器初始化+Tomcat關聯Spring容器 1.任務1-創建Tomcat,並啟動 (1)創建一個Maven項目,修改pom.xml文件:我們需要自己創建Tomcat對象,因此在引入的場景啟動器中排除SpringBoot內嵌的T ...
  • 事情是這樣的,昨晚隔壁老王大晚上出去喝酒,把女友一個人丟在家裡,半夜都還沒回來。 然後我就聽到隔壁來來回回,忙忙碌碌的聲音。 像我這麼心思細膩,體貼入微的Python小哥哥(還好我不姓王) 敏銳的感覺到,老王他女友肯定是失眠了… 好擔心哦,我都睡不著了呢 輾轉反側 最後爬起來擼出了我的python代 ...
  • java介面學習筆記 1. 抽象類和抽象方法 抽象方法:abstract void f(); 抽象類:包含抽象方法的類稱為抽象類。如果一個方法包含一個或多個抽象方法,則該類必須被定義為抽象類,否則編譯器會產生錯誤消息。 示例: public abstract class Basic { abstra ...
  • Qt 學習筆記全系列傳送門: Qt 學習筆記 - 第一章 - 快速開始、信號與槽 Qt 學習筆記 - 第二章 - 添加圖片、佈局、界面切換 Qt 學習筆記 - 第三章 - Qt的三駕馬車之一 - 串口編程 + 程式打包成Windows軟體 Qt 學習筆記 - 第四章 - Qt的三駕馬車之二 - 網路 ...
  • 讀寫Excel基本代碼 直接複製不一定能用 實體類 @ExcelIgnore 在導出操作中不會被導出 @ExcelProperty 在導入過程中 可以根據導入模板自動匹配欄位, 在導出過程中可用於設置導出的標題名字 @Getter @Setter public class Material{ @Ex ...
  • TypeScript 備忘清單 IT寶庫TypeScript開發速查清單包含最重要基礎、泛型、方法、class 等 TypeScript 強類型編程語言語法的快速參考備忘單。初學者的完整快速參考入門,為開發人員分享快速參考備忘單。 開發速查表大綱 入門 Interface 介紹 內置類型基元 常見的 ...
  • Qt 學習筆記全系列傳送門: Qt 學習筆記 - 第一章 - 快速開始、信號與槽 Qt 學習筆記 - 第二章 - 添加圖片、佈局、界面切換 Qt 學習筆記 - 第三章 - Qt的三駕馬車之一 - 串口編程 + 程式打包成Windows軟體 【本章】Qt 學習筆記 - 第四章 - Qt的三駕馬車之二 ...
一周排行
    -Advertisement-
    Play Games
  • 下麵是一個標準的IDistributedCache用例: public class SomeService(IDistributedCache cache) { public async Task<SomeInformation> GetSomeInformationAsync (string na ...
  • 這個庫提供了在啟動期間實例化已註冊的單例,而不是在首次使用它時實例化。 單例通常在首次使用時創建,這可能會導致響應傳入請求的延遲高於平時。在註冊時創建實例有助於防止第一次Request請求的SLA 以往我們要在註冊的時候實例單例可能會這樣寫: //註冊: services.AddSingleton< ...
  • 最近公司的很多項目都要改單點登錄了,不過大部分都還沒敲定,目前立刻要做的就只有一個比較老的項目 先改一個試試手,主要目標就是最短最快實現功能 首先因為要保留原登錄方式,所以頁面上的改動就是在原來登錄頁面下加一個SSO登錄入口 用超鏈接寫的入口,頁面改造後如下圖: 其中超鏈接的 href="Staff ...
  • Like運算符很好用,特別是它所提供的其中*、?這兩種通配符,在Windows文件系統和各類項目中運用非常廣泛。 但Like運算符僅在VB中支持,在C#中,如何實現呢? 以下是關於LikeString的四種實現方式,其中第四種為Regex正則表達式實現,且在.NET Standard 2.0及以上平... ...
  • 一:背景 1. 講故事 前些天有位朋友找到我,說他們的程式記憶體會偶發性暴漲,自己分析了下是非托管記憶體問題,讓我幫忙看下怎麼回事?哈哈,看到這個dump我還是非常有興趣的,居然還有這種游戲幣自助機類型的程式,下次去大玩家看看他們出幣的機器後端是不是C#寫的?由於dump是linux上的程式,剛好win ...
  • 前言 大家好,我是老馬。很高興遇到你。 我們為 java 開發者實現了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何處理的,可以參考我的另一個項目: 手寫從零實現簡易版 tomcat minicat 手寫 ngin ...
  • 上一次的介紹,主要圍繞如何統一去捕獲異常,以及為每一種異常添加自己的Mapper實現,並且我們知道,當在ExceptionMapper中返回非200的Response,不支持application/json的響應類型,而是寫死的text/plain類型。 Filter為二方包異常手動捕獲 參考:ht ...
  • 大家好,我是R哥。 今天分享一個爽飛了的面試輔導 case: 這個杭州兄弟空窗期 1 個月+,面試了 6 家公司 0 Offer,不知道問題出在哪,難道是杭州的 IT 崩盤了麽? 報名面試輔導後,經過一個多月的輔導打磨,現在成功入職某上市公司,漲薪 30%+,955 工作制,不咋加班,還不捲。 其他 ...
  • 引入依賴 <!--Freemarker wls--> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.30</version> </dependency> ...
  • 你應如何運行程式 互動式命令模式 開始一個互動式會話 一般是在操作系統命令行下輸入python,且不帶任何參數 系統路徑 如果沒有設置系統的PATH環境變數來包括Python的安裝路徑,可能需要機器上Python可執行文件的完整路徑來代替python 運行的位置:代碼位置 不要輸入的內容:提示符和註 ...