Bekerja dengan Jenis Protobuf

Karena Google Ads API menggunakan Protobuf sebagai format payload default, penting untuk memahami beberapa konvensi dan jenis Protobuf saat menggunakan API.

Kolom opsional

Banyak kolom di Google Ads API ditandai sebagai optional. Hal ini memungkinkan Anda membedakan antara kasus ketika kolom memiliki nilai kosong, dan server tidak mengirimkan kembali nilai untuk kolom tersebut. Kolom ini berperilaku seperti kolom reguler, tetapi kolom ini juga menyediakan metode tambahan untuk mengosongkan kolom dan memeriksa apakah kolom telah ditetapkan.

Misalnya, kolom Name dari objek Campaign ditandai sebagai opsional. Jadi, Anda dapat menggunakan metode berikut untuk menangani kolom ini.

// Get the name.
string name = campaign.Name;

// Set the name.
campaign.Name = name;

// Check if the campaign object has the name field set.
bool hasName = campaign.HasName();

// Clear the name field. Use this method to exclude Name field from
// being sent to the server in a subsequent API call.
campaign.ClearName();

// Set the campaign to empty string value. This value will be
// sent to the server if you use this object in a subsequent API call.
campaign.Name = "";

// This will throw a runtime error. Use ClearName() instead.
campaign.Name = null;

Jenis berulang

Array kolom direpresentasikan dalam Google Ads API sebagai RepeatedField hanya baca.

Contohnya adalah kolom url_custom_parameters kampanye yang merupakan kolom berulang, sehingga kolom ini direpresentasikan sebagai RepeatedField<CustomParameter> hanya baca di library klien .NET.

RepeatedField mengimplementasikan antarmuka IList<T>.

Ada dua cara untuk mengisi kolom RepeatedField.

Versi C# yang lebih lama: Menambahkan nilai menggunakan metode AddRange

Contohnya diberikan di bawah ini.

Campaign campaign = new Campaign()
{
    ResourceName = ResourceNames.Campaign(customerId, campaignId),
    Status = CampaignStatus.Paused,
};

// Add values to UrlCustomParameters using AddRange method.
campaign.UrlCustomParameters.AddRange(new CustomParameter[]
{
    new CustomParameter { Key = "season", Value = "christmas" },
    new CustomParameter { Key = "promocode", Value = "NY123" }
});

Versi C# yang lebih baru: Menggunakan sintaksis penginisialisasi koleksi

// Option 1: Initialize the field directly.
Campaign campaign = new Campaign()
{
    ResourceName = ResourceNames.Campaign(customerId, campaignId),
    Status = CampaignStatus.Paused,
    // Directly initialize the field.
    UrlCustomParameters =
    {
        new CustomParameter { Key = "season", Value = "christmas" },
        new CustomParameter { Key = "promocode", Value = "NY123" }
    }
};

// Option 2: Initialize using an intermediate variable.
CustomParameter[] parameters = new CustomParameter[]
{
    new CustomParameter { Key = "season", Value = "christmas" },
    new CustomParameter { Key = "promocode", Value = "NY123" }
}

Campaign campaign1 = new Campaign()
{
    ResourceName = ResourceNames.Campaign(customerId, campaignId),
    Status = CampaignStatus.Paused,
    // Initialize from an existing array.
    UrlCustomParameters = { parameters }
};

Jenis OneOf

Beberapa kolom di Google Ads API ditandai sebagai kolom OneOf, yang berarti kolom tersebut dapat berisi jenis yang berbeda, tetapi hanya memiliki satu nilai pada waktu tertentu. {i>OneOf field<i} mirip dengan tipe union di C.

Library .NET menerapkan kolom OneOf dengan menyediakan satu properti untuk setiap jenis nilai yang dapat disimpan di kolom OneOf, dan semua properti yang memperbarui kolom class bersama.

Misalnya, campaign_bidding_strategy kampanye ditandai sebagai kolom OneOf. Class ini diimplementasikan sebagai berikut (kode disederhanakan agar lebih singkat):

public sealed partial class Campaign : pb::IMessage<Campaign>
{
    object campaignBiddingStrategy_ = null;
    CampaignBiddingStrategyOneofCase campaignBiddingStrategyCase_;

    public ManualCpc ManualCpc
    {
        get
        {
            return campaignBiddingStrategyCase_ == CampaignBiddingStrategyOneofCase.ManualCpc ?
                (ManualCpc) campaignBiddingStrategy_ : null;
        }
        set
        {
            campaignBiddingStrategy_ = value;
            campaignBiddingStrategyCase_ = CampaignBiddingStrategyOneofCase.ManualCpc;
        }
    }

    public ManualCpm ManualCpm
    {
        get
        {
            return campaignBiddingStrategyCase_ == CampaignBiddingStrategyOneofCase.ManualCpm ?
                (ManualCpm) campaignBiddingStrategy_ : null;
        }
        set
        {
            campaignBiddingStrategy_ = value;
            campaignBiddingStrategyCase_ = CampaignBiddingStrategyOneofCase.ManualCpm;
        }
    }

    public CampaignBiddingStrategyOneofCase CampaignBiddingStrategyCase
    {
        get { return campaignBiddingStrategyCase_; }
    }
}

Karena properti OneOf berbagi penyimpanan, satu tugas dapat menimpa penetapan sebelumnya, sehingga menyebabkan bug yang samar. Misalnya,

Campaign campaign = new Campaign()
{
    ManualCpc = new ManualCpc()
    {
        EnhancedCpcEnabled = true
    },
    ManualCpm = new ManualCpm()
    {

    }
};

Dalam kasus ini, campaign.ManualCpc sekarang menjadi null karena melakukan inisialisasi kolom campaign.ManualCpm akan menimpa inisialisasi sebelumnya untuk campaign.ManualCpc.

Konversi ke format lain

Anda dapat dengan mudah mengonversi objek protobuf ke format JSON dan secara terbalik. Hal ini berguna saat membangun sistem yang perlu berinteraksi dengan sistem lain yang memerlukan data dalam format berbasis teks seperti JSON atau XML.

GoogleAdsRow row = new GoogleAdsRow()
{
    Campaign = new Campaign()
    {
        Id = 123,
        Name = "Campaign 1",
        ResourceName = ResourceNames.Campaign(1234567890, 123)
    }
};
// Serialize to JSON and back.
string json = JsonFormatter.Default.Format(row);
row = GoogleAdsRow.Parser.ParseJson(json);

Anda juga dapat membuat serialisasi objek ke byte dan kembali. Serialisasi biner lebih hemat memori dan penyimpanan daripada format JSON.

GoogleAdsRow row = new GoogleAdsRow()
{
    Campaign = new Campaign()
    {
        Id = 123,
        Name = "Campaign 1",
        ResourceName = ResourceNames.Campaign(1234567890, 123)
    }
};
// Serialize to bytes and back.
byte[] bytes = row.ToByteArray();
row = GoogleAdsRow.Parser.ParseFrom(bytes);